OpenCV - Limiar Adaptativo
Dentro simple thresholding, o valor do limite é global, ou seja, é o mesmo para todos os pixels da imagem. Adaptive thresholding é o método em que o valor do limite é calculado para regiões menores e, portanto, haverá valores de limite diferentes para regiões diferentes.
No OpenCV, você pode realizar a operação de limite adaptativo em uma imagem usando o método adaptiveThreshold() do Imgprocclasse. A seguir está a sintaxe desse método.
adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)
Este método aceita os seguintes parâmetros -
src - Um objeto da aula Mat representando a imagem de origem (entrada).
dst - Um objeto da aula Mat representando a imagem de destino (saída).
maxValue - Uma variável de tipo duplo que representa o valor a ser fornecido se o valor do pixel for maior que o valor limite.
adaptiveMethod- Uma variável de número inteiro do tipo que representa o método adaptativo a ser usado. Este será um dos seguintes dois valores
ADAPTIVE_THRESH_MEAN_C - o valor limite é a média da área da vizinhança.
ADAPTIVE_THRESH_GAUSSIAN_C - o valor limite é a soma ponderada dos valores da vizinhança em que os pesos são uma janela Gaussiana.
thresholdType - Uma variável de tipo inteiro que representa o tipo de limite a ser usado.
blockSize - Uma variável do tipo inteiro que representa o tamanho da vizinhança do pixel usada para calcular o valor limite.
C - Uma variável de tipo duplo que representa a constante utilizada nos dois métodos (subtraída da média ou média ponderada).
Exemplo
O programa a seguir demonstra como realizar a operação de limite adaptativo em uma imagem no OpenCV. Aqui estamos escolhendo o limite adaptativo do tipobinary e ADAPTIVE_THRESH_MEAN_C para o método de limite.
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");
}
}
Suponha que a seguir está a imagem de entrada thresh_input.jpg especificado no programa acima.
Resultado
Ao executar o programa, você obterá a seguinte saída -
Image Processed
Se você abrir o caminho especificado, poderá observar a imagem de saída da seguinte maneira -
Outros tipos de limiar adaptativo
Em adição a ADAPTIVE_THRESH_MEAN_C como o método adaptativo e THRESH_BINARY como o tipo de limite, conforme demonstrado no exemplo anterior, podemos escolher mais combinações desses dois valores.
Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C,
Imgproc.THRESH_BINARY, 11, 12);
A seguir estão os valores que representam várias combinações de valores para os parâmetros adaptiveMethod e thresholdType e suas respectivas saídas.
adaptiveMethod / thresholdType | ADAPTIVE_THRESH_MEAN_C | ADAPTIVE_THRESH_GAUSSIAN_C: |
---|---|---|
THRESH_BINARY |
|
|
THRESH_BINARY_INV |
|
|