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 |
|
|