OpenCV - адаптивный порог

В simple thresholding, пороговое значение является глобальным, т. е. одинаковым для всех пикселей изображения. Adaptive thresholding - это метод, при котором пороговое значение рассчитывается для небольших регионов, поэтому для разных регионов будут разные пороговые значения.

В OpenCV вы можете выполнить операцию адаптивного порога с изображением, используя метод adaptiveThreshold() из Imgprocкласс. Ниже приводится синтаксис этого метода.

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

Этот метод принимает следующие параметры -

  • src - Объект класса Mat представляющий исходное (входное) изображение.

  • dst - Объект класса Mat представляющий конечное (выходное) изображение.

  • maxValue - Переменная типа double, представляющая значение, которое должно быть присвоено, если значение пикселя больше порогового значения.

  • adaptiveMethod- Целочисленная переменная, представляющая используемый адаптивный метод. Это будет одно из следующих двух значений

    • ADAPTIVE_THRESH_MEAN_C - пороговое значение - это среднее значение площади соседства.

    • ADAPTIVE_THRESH_GAUSSIAN_C - пороговое значение - это взвешенная сумма значений окрестностей, где веса являются окном Гаусса.

  • thresholdType - Переменная целочисленного типа, представляющая тип используемого порога.

  • blockSize - Переменная целочисленного типа, представляющая размер пиксельной окрестности, используемой для вычисления порогового значения.

  • C - Переменная типа double, представляющая константу, используемую в обоих методах (вычтенную из среднего или взвешенного среднего).

пример

Следующая программа демонстрирует, как выполнить операцию адаптивного порога для изображения в OpenCV. Здесь мы выбираем адаптивный порог типаbinary и ADAPTIVE_THRESH_MEAN_C для порогового метода.

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");
   } 
}

Предположим, что ниже находится входное изображение thresh_input.jpg указанные в вышеуказанной программе.

Вывод

При выполнении программы вы получите следующий вывод -

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:

Другие типы адаптивной пороговой обработки

В добавок к ADAPTIVE_THRESH_MEAN_C как адаптивный метод и THRESH_BINARY в качестве типа порога, как показано в предыдущем примере, мы можем выбрать больше комбинаций этих двух значений.

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

Ниже приведены значения, представляющие различные комбинации значений параметров. adaptiveMethod и thresholdType и их соответствующие выходы.

AdaptiveMethod / thresholdType ADAPTIVE_THRESH_MEAN_C ADAPTIVE_THRESH_GAUSSIAN_C:
THRESH_BINARY
THRESH_BINARY_INV