Skip to content

Archives

  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021

Categories

  • No hay categorías
Trend RepositoryArticles and guides
Articles

OpenCV Threshold ( Python , C++ )

On enero 4, 2022 by admin
  • ¿Qué es el umbral de la imagen?
  • Ejemplos de umbral: C++ y Python
  • Imagen de entrada
  • Umbralización binaria ( type = THRESH_BINARY )
  • Umbral binario inverso ( type = THRESH_BINARY_INV )
  • Umbral truncado ( type = THRESH_TRUNC )
  • Umbral a cero ( type = THRESH_TOZERO )
  • Umbral Invertido a Cero ( type = THRESH_TOZERO_INV)
  • Descargar código e imagen de ejemplo

¿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.

Este post ha sido probado en OpenCV 4.4.

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.

Figura 2: Imagen de entrada. Haga clic para abrir un PNG de alta resolución en una ventana diferente

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.

Figura 3 : Umbral binario ( thresh = 0 y maxValue = 255)

Cambiando thresh a 127 se eliminan todos los números menores o iguales a 127.

Figura 4 : Umbral binario ( thresh = 127 y maxValue = 255)

Cambiando maxValue a 128 establece el valor de las regiones con umbral a 128.

Figura 5: Umbral binario con maxValue fijado en 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.

Figura 6 : Umbral binario inverso ( thresh = 127, maxValue = 0 )

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.

Figura 7 : Truncar el umbral (thresh = 127)

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

Figura 8: Umbral a Cero ( thresh = 127 )

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.

Figura 9: Umbral invertido a cero ( thresh = 127 )

Descargar código e imagen de ejemplo

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Archivos

  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021

Meta

  • Acceder
  • Feed de entradas
  • Feed de comentarios
  • WordPress.org
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress