自适应阈值化操作:adaptiveThreshold()函数
在圖像閾值化操作中,更關(guān)注的是從二值化圖像中,分離目標(biāo)區(qū)域和背景區(qū)域,但是僅僅通過設(shè)定固定閾值很難達(dá)到理想的分割效果。而自適應(yīng)閾值,則是根據(jù)像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。這樣做的好處:
1. 每個像素位置處的二值化閾值不是固定不變的,而是由其周圍鄰域像素的分布來決定的。
2. 亮度較高的圖像區(qū)域的二值化閾值通常會較高,而亮度低的圖像區(qū)域的二值化閾值則會相適應(yīng)的變小。
3. 不同亮度、對比度、紋理的局部圖像區(qū)域?qū)碛邢鄬?yīng)的局部二值化閾值。
函數(shù)原型
1. void adaptiveThreshold(InputArray src, OutputArray dst, 2. double maxValue, int adaptiveMethod, 3. int thresholdType, int bolckSize, double C)參數(shù)說明
參數(shù)1:InputArray類型的src,輸入圖像,填單通道,單8位浮點(diǎn)類型Mat即可。
參數(shù)2:函數(shù)運(yùn)算后的結(jié)果存放在這。即為輸出圖像(與輸入圖像同樣的尺寸和類型)。
參數(shù)3:預(yù)設(shè)滿足條件的最大值。
參數(shù)4:指定自適應(yīng)閾值算法。可選擇ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C兩種。(具體見下面的解釋)。
參數(shù)5:指定閾值類型。可選擇THRESH_BINARY或者THRESH_BINARY_INV兩種。(即二進(jìn)制閾值或反二進(jìn)制閾值)。
參數(shù)6:表示鄰域塊大小,用來計算區(qū)域閾值,一般選擇為3、5、7......等。
參數(shù)7:參數(shù)C表示與算法有關(guān)的參數(shù),它是一個從均值或加權(quán)均值提取的常數(shù),可以是負(fù)數(shù)。(具體見下面的解釋)。
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ADAPTIVE_THRESH_MEAN_C,為局部鄰域塊的平均值,該算法是先求出塊中的均值,再減去常熟C。
ADAPTIVE_THRESH_GAUSSIAN_C,為局部鄰域塊的高斯加權(quán)和。該算法是在區(qū)域中(x, y)周圍的像素根據(jù)高斯函數(shù)按照他們離中心點(diǎn)的距離進(jìn)行加權(quán)計算,再減去常數(shù)C。
舉個例子:如果使用平均值方法,平均值mean為190,差值delta(即常數(shù)C)為30。那么灰度小于160的像素為0,大于等于160的像素為255。如下圖:
如果是反向二值化,如下圖:
delta(常數(shù)C)選擇負(fù)值也是可以的。
代碼演示
/*自適應(yīng)閾值:adaptiveThreshold()函數(shù) */#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv;int main() {//------------【1】讀取源圖像并檢查圖像是否讀取成功------------ Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\build.jpg");if (!srcImage.data){cout << "讀取圖片錯誤,請重新輸入正確路徑!\n";system("pause");return -1;}imshow("【源圖像】", srcImage);//------------【2】灰度轉(zhuǎn)換------------ Mat srcGray;cvtColor(srcImage, srcGray, CV_RGB2GRAY);imshow("【灰度圖】", srcGray);//------------【3】初始化相關(guān)變量--------------- Mat dstImage; //初始化自適應(yīng)閾值參數(shù)const int maxVal = 255;int blockSize = 3; //取值3、5、7....等int constValue = 10;int adaptiveMethod = 0;int thresholdType = 1;/*自適應(yīng)閾值算法0:ADAPTIVE_THRESH_MEAN_C1:ADAPTIVE_THRESH_GAUSSIAN_C--------------------------------------閾值類型0:THRESH_BINARY1:THRESH_BINARY_INV*///---------------【4】圖像自適應(yīng)閾值操作------------------------- adaptiveThreshold(srcGray, dstImage, maxVal, adaptiveMethod, thresholdType, blockSize, constValue);imshow("【自適應(yīng)閾值】", dstImage);waitKey(0);return 0; }顯示結(jié)果
可以發(fā)現(xiàn)自適應(yīng)閾值能很好的觀測到邊緣信息。閾值的選取是算法自動完成的,很方便。
濾波處理?
另外,做不做濾波處理等對圖像分割影響也比較大。
1. adaptiveThreshold分割
Mat img=imread("D:/ImageTest/sudoku.png",CV_LOAD_IMAGE_COLOR);Mat dst1;Mat dst2;Mat dst3;cv::cvtColor(img,img,COLOR_RGB2GRAY);//進(jìn)行,灰度處理medianBlur(img,img,5);//中值濾波threshold(img,dst1, 127, 255, THRESH_BINARY);//閾值分割adaptiveThreshold(img,dst2,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,11,2);//自動閾值分割,鄰域均值adaptiveThreshold(img,dst3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,11,2);//自動閾值分割,高斯鄰域//ADAPTIVE_THRESH_MEAN_C : threshold value is the mean of neighbourhood area//ADAPTIVE_THRESH_GAUSSIAN_C : threshold value is the weighted sum of neighbourhood values where weights are a gaussian window. imshow("dst1", dst1);imshow("dst2", dst2);imshow("dst3", dst3);imshow("img", img);waitKey(0);效果對比,很明顯加入鄰域權(quán)重后處理更理想:
2. 加入濾波處理的最大類間方差分割
Mat img=imread("D:/ImageTest/pic2.png",CV_LOAD_IMAGE_COLOR);Mat dst1;Mat dst2;Mat dst3;cv::cvtColor(img,img,COLOR_RGB2GRAY);//進(jìn)行,灰度處理// medianBlur(img,img,5);threshold(img,dst1, 127, 255, THRESH_BINARY);threshold(img,dst2,0, 255, THRESH_OTSU);//最大類間方差法分割 Otsu algorithm to choose the optimal threshold valueMat img2=img.clone();GaussianBlur(img2,img2,Size(5,5),0);//高斯濾波去除小噪點(diǎn)threshold(img2,dst3, 0, 255, THRESH_OTSU);imshow("BINARY dst1", dst1);imshow("OTSU dst2", dst2);imshow("GaussianBlur OTSU dst3", dst3);imshow("original img", img);waitKey(0);效果如下,顯然不濾波和濾波差別明顯:
?
?
?
?
參考文章:https://blog.csdn.net/sinat_36264666/article/details/77586964
? ? ? ? ? ? ?https://blog.csdn.net/abcvincent/article/details/78822191
轉(zhuǎn)載于:https://www.cnblogs.com/GaloisY/p/11037350.html
總結(jié)
以上是生活随笔為你收集整理的自适应阈值化操作:adaptiveThreshold()函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输卵管堵塞的话会有什么症状
- 下一篇: 蜜桃臀如何练效果最好?