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