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 |