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