OpenCV Threshold ( Python , C++ )
On enero 4, 2022 by admin¿Qué es el umbral de la imagen?
Observa atentamente la animación de abajo (Figura 1). ¿Cuántos números ve? La mayoría de ustedes verán los números 32 (oh sí, fíjate bien), 64, 100, 128, 180, 200 y 255. Pero hay más en la imagen de lo que se ve a simple vista.
En un segundo puedes ver la versión umbralizada de la imagen original. Observará que todos los números parecen completamente blancos (es decir, tienen un valor de escala de grises de 255) y que hay un número 5 adicional. En la imagen original no se notaba el número 5 porque su valor de escala de grises era, bueno, 5. De hecho, todos los números de la imagen original tienen un valor de escala de grises igual al número. Por lo tanto, 255 es el más brillante y 5 es el más oscuro.
Leer los números en la imagen umbralizada es mucho más fácil que leer los números en la imagen original. No es de extrañar que un algoritmo de reconocimiento de texto encuentre la imagen umbralizada en nuestro ejemplo mucho más fácil de procesar que la imagen original.
En la Visión por Computador cuando se hace una tarea más fácil para los seres humanos, normalmente se hace más fácil para los algoritmos informáticos también.
Todos los algoritmos de umbralización toman una imagen de origen (src) y un valor de umbral (thresh) como entrada y producen una imagen de salida (dst) comparando el valor del píxel en el píxel de origen ( x , y ) con el umbral. Si src ( x , y ) > thresh , entonces se asigna a dst ( x , y ) algún valor. En caso contrario, a dst ( x , y ) se le asigna algún otro valor.
La forma más simple de umbralización se llama Umbralización Binaria. Además de la imagen de origen (src) y el valor del umbral (thresh), toma otro parámetro de entrada llamado valor máximo ( maxValue ). En cada posición de píxel (x,y) compara el valor de píxel src ( x , y ) con thresh. Si src ( x , y ) es mayor que thresh, establece el valor del píxel de la imagen de destino dst ( x , y ) a maxValue. En caso contrario, lo pone a cero. Este es el aspecto del pseudocódigo.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
De forma más general, hay muchos tipos de umbralización basados en diferentes reglas de umbralización aplicadas a src ( x , y ) para obtener dst ( x , y ). Veamos los distintos tipos de umbral disponibles en OpenCV.
Ejemplos de umbral: C++ y Python
Si tienes prisa, salta a la sección de descargas para obtener el código y la imagen de ejemplo.
Imagen de entrada
En los siguientes ejemplos, utilizaremos esta imagen como entrada. Haga clic en la Figura 2 para descargar la imagen en formato PNG. La imagen de entrada contiene números escritos con intensidad (valor de la escala de grises) igual al propio número. Por ejemplo, el valor del píxel del número 200 es 200, y el de 32 es 32. Por eso 32 aparece mucho más oscuro que 200 en la imagen.
En cada ejemplo, explicaremos la regla de umbralización a través de un pseudocódigo, proporcionaremos un ejemplo en C++ y python, y la imagen de salida umbralizada.
Umbralización binaria ( type = THRESH_BINARY )
Este es el tipo de umbralización más común y simple.
Regla de umbralización
# Binary Thresholdif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Python
# import opencvimport cv2# Read imagesrc = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)# Set threshold and maxValuethresh = 0maxValue = 255 # Basic threshold exampleth, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);
C++
using namespace cv; // Read imageMat src = imread("threshold.png", IMREAD_GRAYSCALE);Mat dst;// Set threshold and maxValuedouble thresh = 0;double maxValue = 255; // Binary Thresholdthreshold(src,dst, thresh, maxValue, THRESH_BINARY);
Resultado de Umbralización Binaria
La figura 3 muestra el resultado de aplicar umbralización binaria a la imagen de entrada con thresh = 0 y maxValue = 255.
Cambiando thresh a 127 se eliminan todos los números menores o iguales a 127.
Cambiando maxValue a 128 establece el valor de las regiones con umbral a 128.
Umbral binario inverso ( type = THRESH_BINARY_INV )
El umbral binario inverso es justo lo contrario del umbral binario. El píxel de destino se pone a cero si el píxel de origen correspondiente es mayor que el umbral, y a maxValue, si el píxel de origen es menor que el umbral.
Regla de umbralización
# Inverse Binary Thresholdif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = maxValue
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)
C++
threshold(src,dst, thresh, maxValue, THRESH_BINARY_INV);
Resultado de la umbralización binaria inversa
Nótese que el resultado de la umbralización binaria inversa mostrado en la Figura 6 es exactamente el inverso de la Figura 4.
Umbral truncado ( type = THRESH_TRUNC )
En este tipo de umbral, el píxel de destino se establece en el umbral ( thresh ) si el valor del píxel de origen es mayor que el umbral. De lo contrario, se establece el valor del píxel de origen. maxValue se ignora.
Regla de umbralización
# Truncate Thresholdif src(x,y) > thresh dst(x,y) = threshelse dst(x,y) = src(x,y)
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TRUNC)
C++
threshold(src,dst, thresh, maxValue, THRESH_TRUNC);
Resultado de Truncate Thresholding
La figura 7 muestra el resultado de aplicar Truncate Thresholding a la imagen de entrada. Observe que todos los valores por encima del umbral ( 127 ) se establecen en 127, y todos los valores menores o iguales a 127 no se modifican. maxValue se ignora.
Umbral a cero ( type = THRESH_TOZERO )
En este tipo de umbralización, el valor del píxel de destino se establece en el valor del píxel de origen correspondiente si el valor del píxel de origen es mayor que el umbral. De lo contrario, se pone a cero. maxValue se ignora.
Regla de umbralización
# Threshold to Zeroif src(x,y) > thresh dst(x,y) = src(x,y)else dst(x,y) = 0
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO)
C++
threshold(src,dst, thresh, maxValue, THRESH_TOZERO);
Resultado de Umbral a Cero
Umbral Invertido a Cero ( type = THRESH_TOZERO_INV)
En este tipo de umbralización, el valor del píxel destino se pone a cero si el valor del píxel origen es mayor que el umbral. En caso contrario, se establece el valor del píxel de origen. maxValue se ignora.
Regla de umbralización
# Inverted Threshold to Zeroif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = src(x,y)
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO_INV)
C++
threshold(src,dst, thresh, maxValue, THRESH_TOZERO_INV);
Resultado de Umbral Invertido a Cero
La figura 9 muestra el resultado de aplicar Umbral Invertido a Cero a la imagen de entrada. Los números por debajo del umbral conservan su valor de escala de grises, y los números por encima del umbral son 0 excepto el límite. Los artefactos en el límite se deben a que los valores de los píxeles en el límite pasan de 0 al valor del número en unos pocos píxeles. Así que algunos de los píxeles del límite están por debajo del umbral.
Deja una respuesta