OpenCV Umbralizado de imágenes

En el procesamiento de imágenes, el umbralizado es una técnica común utilizada para convertir una imagen en una imagen binaria (es decir, en blanco y negro). Al establecer un umbral, los píxeles de la imagen se pueden dividir en dos categorías: píxeles por encima del umbral y píxeles por debajo del umbral.

OpenCV proporciona varios métodos de umbralizado. Este artículo presentará en detalle tres técnicas comunes de umbralizado: umbralizado simple, umbralizado adaptativo y binarización de Otsu.

1. Umbralizado simple (cv2.threshold())

El umbralizado simple es el método de umbralizado más básico. Divide los píxeles de la imagen en dos categorías estableciendo un umbral fijo.

OpenCV proporcionacv2.threshold()la función para implementar esta funcionalidad.

Prototipo de la función

retval, dst = cv2.threshold(src, thresh, maxval, type)

Descripción de parámetros

  • src: Imagen de entrada, generalmente en escala de grises.
  • thresh: El umbral establecido.
  • maxval: El nuevo valor asignado cuando el valor del píxel supera (o es menor, según el tipo) el umbral.
  • type: El tipo de umbralizado, los tipos comunes son:
    • cv2.THRESH_BINARY: Si el valor del píxel es mayor que el umbral, se asignamaxval; de lo contrario, se asigna0。
    • cv2.THRESH_BINARY_INV: Equivale acv2.THRESH_BINARYlo contrario, si el valor del píxel es mayor que el umbral, se asigna0; de lo contrario, se asignamaxval。
    • cv2.THRESH_TRUNC: Si el valor del píxel es mayor que el umbral, se asigna el umbral; de lo contrario, permanece igual.
    • cv2.THRESH_TOZERO: Si el valor del píxel es mayor que el umbral, permanece igual; de lo contrario, se asigna0。
    • cv2.THRESH_TOZERO_INV: Equivale acv2.THRESH_TOZEROlo contrario, si el valor del píxel es mayor que el umbral, se asigna0; de lo contrario, permanece igual.

Valor de retorno

  • retval: El umbral realmente utilizado (en algunos casos puede diferir del umbral establecido).
  • dst: La imagen procesada.

Ejemplo

Ejemplo

import cv2
import numpy as np

# Leer la imagen
img = cv2.imread('image.jpg', 0)

# Umbralizado simple
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

# Mostrar el resultado
cv2.imshow('Binary Threshold', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. Umbralizado adaptativo (cv2.adaptiveThreshold())

En algunos casos, la distribución de brillo de la imagen no es uniforme, y el uso de un umbral fijo puede no lograr resultados ideales. El umbralizado adaptativo maneja mejor esta situación calculando diferentes umbrales para diferentes regiones de la imagen.

Prototipo de la función

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

Descripción de parámetros

  • src: Imagen de entrada, generalmente en escala de grises.
  • maxValue: El nuevo valor asignado cuando el valor del píxel supera (o es menor, según el tipo) el umbral.
  • adaptiveMethod: Método de cálculo del umbral adaptativo, los tipos comunes son:
    • cv2.ADAPTIVE_THRESH_MEAN_C: El umbral es el promedio de la vecindad menos la constanteC。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C: El umbral es el promedio ponderado de la vecindad menos la constanteC, el peso está determinado por la función gaussiana.
  • thresholdType: El tipo de umbralizado, generalmentecv2.THRESH_BINARYocv2.THRESH_BINARY_INV。
  • blockSize: El tamaño de la vecindad utilizado para calcular el umbral, debe ser un número impar.
  • C: La constante que se resta del promedio o del promedio ponderado.

Valor de retorno

  • dst: La imagen procesada.

Ejemplo

Ejemplo

import cv2
import numpy as np

# Leer la imagen
img = cv2.imread('image.jpg', 0)

# Umbralizado adaptativo
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

# Mostrar el resultado
cv2.imshow('Adaptive Threshold', thresh2)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. Binarización de Otsu (cv2.threshold() with cv2.THRESH_OTSU)

La binarización de Otsu es un método para determinar automáticamente el umbral. Encuentra el umbral global óptimo maximizando la varianza entre clases, y es adecuada para imágenes bimodales (es decir, imágenes cuyo histograma tiene dos picos evidentes).

Prototipo de la función

retval, dst = cv2.threshold(src, thresh, maxval, type)

Descripción de parámetros

  • src: Imagen de entrada, generalmente en escala de grises.
  • thresh: Dado que el método de Otsu determina automáticamente el umbral, este parámetro generalmente se establece en0。
  • maxval: El nuevo valor asignado cuando el valor del píxel supera (o es menor, según el tipo) el umbral.
  • type: El tipo de umbralizado, generalmentecv2.THRESH_BINARYocv2.THRESH_BINARY_INV, y se agregacv2.THRESH_OTSU。

Valor de retorno

  • retval: El umbral determinado automáticamente.
  • dst: La imagen procesada.

Ejemplo

Ejemplo

import cv2
import numpy as np

# Leer la imagen
img = cv2.imread('image.jpg', 0)

# Binarización de Otsu
ret, thresh3 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# Mostrar el resultado
cv2.imshow('Otsu\'s Threshold', thresh3)
cv2.waitKey(0)
cv2.destroyAllWindows()
Otras extensiones