OpenCV的threshold函數(shù)一般是給定一個閾值,對超過或者低于這個閾值的像素進行處理,函數(shù)如下:
threshold( InputArray src, // 輸入圖像 OutputArray dst, // 輸出圖像 double thresh, // 閾值 double maxValue, // 最大值(對于三通道圖像一般是255) int thresholdType // 閾值化操作的類型 ) 閾值化操作的類型常用兩種: THRESH_BINARY //黑背景找白目標(即超過設(shè)定閾值的值置255,其他為0)THRESH_BINARY_INV //白背景找黑目標(即超過設(shè)定閾值的值置0,其他為255)
全局閾值類似一刀切的概念。對于整體圖像來說,找到一個合適的閾值,將圖像分為0(黑色)和255(白色)。
對于亮度分布差異較大的圖像,因為常常無法找到一個合適的閾值。因此我們需要一種改進的閾值化算法,即自適應(yīng)閾值化。
OutputArray dst, maxValue, adaptiveMethod, thresholdType blockSize, C
自適應(yīng)閾值化能夠根據(jù)圖像不同區(qū)域亮度分布的,改變閾值。因此,我們針對同一圖像的不同區(qū)域獲得不同的閾值,并為具有不同照明的圖像提供更好的結(jié)果。
對于圖像具有明顯的雙分界特征,可以使用雙閾值法進行二值化操作,即實現(xiàn)Halcon中的threshold函數(shù)。
簡單來說:
Halcon的threshold函數(shù)是獲取區(qū)間[a, b]之間的灰度值(雙閾值)
OpenCV的threshold只能針對大于或者小于a或者b的灰度值處理(單閾值)
因此我們可以預(yù)設(shè)兩個特定的閾值量thresh1、thresh2,并且thresh1 < thresh2 。閾值化的過程就是,將在 (thresh1,thresh2) 這個區(qū)間內(nèi)的灰度值設(shè)置為maxVal(255),將其余部分設(shè)置為0 。
const int maxVal = 255; //預(yù)設(shè)最大值 int low_threshold = 90; //較小的閾值量 int high_threshold = 190; //較大的閾值量 //小閾值對源灰度圖像進行二進制閾值化操作 threshold(srcGray, dst1, low_threshold, maxVal, THRESH_BINARY); //大閾值對源灰度圖像進行反二進制閾值化操作 threshold(srcGray, dst2, high_threshold, maxVal, THRESH_BINARY_INV); //矩陣"與運算"得到二值化結(jié)果 bitwise_and(dst1, dst2, dst); //對像素加和 imshow("雙閾值二值化", dst);