在簡單閾值化中,閾值是全局的,即對圖像中的所有像素都是相同的。自適應閾值是針對較小區域計算閾值的方法,因此,對於不同區域將有不同的閾值。
在OpenCV中,可以使用Imgproc類的方法Adaptive threshold()對圖像執行自適應閾值操作。下面是這個方法的語法。
adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)
此方法接受以下參數&負;
src−類的對象表示源(輸入)圖像。
dst−類的對象表示目標(輸出)圖像。
maxValue−雙精度類型的變量,表示像素值大於閾值時要給定的值。
adaptive method−一個整數變量,表示要使用的自適應方法的類型。這將是以下兩個值之一
自適應閾值是鄰域面積的平均值。
自適應閾值是權重爲高斯窗口的鄰域值的加權和。
threshold type−整數類型的變量,表示要使用的閾值類型。
blockSize−整數類型的變量,表示用於計算閾值的像素鄰域的大小。
C−表示兩種方法中使用的常數的雙精度變量(從平均值或加權平均值中減去)。
Example
下面的程序演示如何在OpenCV中對圖像執行自適應閾值操作。在這裡,我們爲閾值方法選擇了類型二進位和類型自適應_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。
Output
在執行程序時,您將得到以下輸出&負;
Image Processed
如果您打開指定的路徑,您可以按以下方式觀察輸出圖像−
Other Types of Adaptive Thresholding
除了作爲自適應方法的自適應閾值平均值和作爲前一示例中演示的閾值類型的閾值二進位值之外,我們還可以選擇這兩個值的更多組合。
Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 12);
下面是表示參數adaptiveMethod和thresholdType及其各自輸出值的各種組合的值。