Umbralización en OpenCV

La umbralización es uno de los métodos más simples y eficientes de segmentación, segmentar quiere decir, separar o extraer las regiones de una imagen que nos interese estudiar o analizar, para lograr separar la región deseada se establece un valor que define el umbral, los pixeles cuya intensidad superen el umbral serán rechazado o aceptados, según sea el caso.

En OpenCV podemos aplicar esta técnica mediante la función cv::threshold, tenemos disponibles varios tipos de umbralización, la imagen de entrada debe ser a escala de grises, esta función se define del siguiente modo:

double cv::threshold(
   cv::InputArray src,  // Imagen de entrada
   cv::OutputArray dst, // Imagen resultante
   double thresh,       // Valor del umbral
   double maxValue,     // Máximo valor
   int thresholdType    // Tipo de operación
);

El tipo de umbralización define como se crea la imagen resultante, se recorren cada uno de los pixeles de la imagen de entrada y se calcula cada uno de los resultados de la siguiente manera:

tipos de umbralización

Para probar cada uno de los tipos disponibles vamos a usar esta imagen:

herramientas

Además del código Python que se muestra a continuación:

import numpy as np
import cv2

gray = cv2.imread('herramientas.jpg', cv2.IMREAD_GRAYSCALE)

t, dst = cv2.threshold(gray, 170, 255, cv2.THRESH_BINARY)

cv2.imshow('umbral', gray)
cv2.imshow('result', dst)

cv2.waitKey(0)

El umbral está definido en 170 y el máximo valor a 255, lo que variamos de aquí en adelante es el tipo.

1. Umbral binario (THRESH_BINARY)

Si la intensidad del pixel es mayor al umbral establecido el pixel de destino a establece al máximo valor definido, en caso contrario se establece a cero:

umbral binario (THRESH_BINARY)

umbral binario (THRESH_BINARY)

2. Umbral binario invertido (THRESH_BINARY_INV)

Similar al anterior, solo que aplicado al inverso, si la intensidad supera el umbral definido el valor resultante será establecido a cero, en caso contrario se establecerá al máximo valor definido.

Umbral binario invertido (THRESH_BINARY_INV)

Umbral binario invertido (THRESH_BINARY_INV)

3. Truncar (THRESH_TRUNC)

En este caso si la intensidad del pixel es superior al umbral entonces el pixel destino se establece a el valor del umbral, en caso contrario el valor será igual al original, en otras palabras, cualquier pixel que supere el umbral tomará el valor del mismo, los demás permanecen igual.

 Truncar (THRESH_TRUNC)

 Truncar (THRESH_TRUNC)

4. Ajustar a cero (THRESH_TOZERO)

Cualquier pixel cuya intensidad no supere el umbral se establecerá a cero, se define de la siguiente manera:

Ajustar a cero (THRESH_TOZERO)

Ajustar a cero (THRESH_TOZERO)

5. Ajuste a cero invertido (THRESH_TOZERO_INV)

Similar al anterior, pero al inverso, esta vez, si la intensidad supera el umbral establecido el valor de salida se ajustará acero.

Ajuste a cero invertido (THRESH_TOZERO_INV)

Ajuste a cero invertido (THRESH_TOZERO_INV)

Para finalizar veremos como calcular el umbral más optimo de manera automática, la elección del mismo suele ser una tarea difícil, OpenCV nos facilita el trabajo implementando los métodos: THRESH_OTSU o THRESH_TRIANGLE, veamos como se utiliza esta opción.

t, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE)

El parámetro devuelto t contiene el valor del umbral calculado con el método indicado.

algortimo de otsu y triangulo

Puedes también probar el método de Otsu y ver los resultados.

Código de ejemplo C++, (proporcionado por la documentación de OpenCV)

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Acceso a la webcam con OpenCV

JavaFx 8 Administrar ventanas

Analizador Léxico