OpenCV - Umbral adaptativo

En simple thresholding, el valor de umbral es global, es decir, es el mismo para todos los píxeles de la imagen. Adaptive thresholding es el método en el que el valor de umbral se calcula para regiones más pequeñas y, por lo tanto, habrá diferentes valores de umbral para diferentes regiones.

En OpenCV, puede realizar una operación de umbral adaptativo en una imagen utilizando el método adaptiveThreshold() del Imgprocclase. A continuación se muestra la sintaxis de este método.

adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

  • maxValue - Una variable de tipo doble que representa el valor que se debe dar si el valor del píxel es mayor que el valor umbral.

  • adaptiveMethod- Una variable de tipo entero que representa el método adaptativo que se utilizará. Este será cualquiera de los dos valores siguientes

    • ADAPTIVE_THRESH_MEAN_C - el valor umbral es la media del área del vecindario.

    • ADAPTIVE_THRESH_GAUSSIAN_C - el valor umbral es la suma ponderada de los valores de vecindad donde los pesos son una ventana gaussiana.

  • thresholdType - Una variable de tipo entero que representa el tipo de umbral que se utilizará.

  • blockSize - Una variable de tipo entero que representa el tamaño de la vecindad de píxeles utilizada para calcular el valor de umbral.

  • C - Una variable de tipo doble que representa la constante utilizada en ambos métodos (restada de la media o media ponderada).

Ejemplo

El siguiente programa demuestra cómo realizar la operación de umbral adaptativo en una imagen en OpenCV. Aquí estamos eligiendo un umbral adaptativo de tipobinary y ADAPTIVE_THRESH_MEAN_C para el método de umbral.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AdaptiveThresh {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap14/thresh_input.jpg";
      
      // Reading the image
      Mat src = Imgcodecs.imread(file,0);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C,
         Imgproc.THRESH_BINARY, 11, 12);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap14/Adaptivemean_thresh_binary.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Suponga que la siguiente es la imagen de entrada thresh_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Otros tipos de umbralización adaptativa

Además de ADAPTIVE_THRESH_MEAN_C como el método adaptativo y THRESH_BINARY como tipo de umbral como se demostró en el ejemplo anterior, podemos elegir más combinaciones de estos dos valores.

Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 12);

A continuación se muestran los valores que representan varias combinaciones de valores para los parámetros. adaptiveMethod y thresholdType y sus respectivos productos.

adaptiveMethod /resholdType ADAPTIVE_THRESH_MEAN_C ADAPTIVE_THRESH_GAUSSIAN_C:
THRESH_BINARY
THRESH_BINARY_INV