較為常用的圖像二值化方法有:1)全局固定閾值;2)局部自適應閾值;3)OTSU等。
全局固定閾值很容易理解,就是對整幅圖像都是用一個統一的閾值來進行二值化;
局部自適應閾值則是根據像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。這樣做的好處在於每個像素位置處的二值化閾值不是固定不變的,而是由其周圍鄰域像素的分布來決定的。亮度較高的圖像區域的二值化閾值通常會較高,而亮度較低的圖像區域的二值化閾值則會相適應地變小。不同亮度、對比度、紋理的局部圖像區域將會擁有相對應的局部二值化閾值。常用的局部自適應閾值有:1)局部鄰域塊的均值;2)局部鄰域塊的高斯加權和。
OpenCV中實現了以上幾種二值化方法。
下面這段代碼對比了全局固定閾值與局部自適應閾值的二值化結果。
- // 基於局部自適應閾值的圖像二值化
- // Author: http://blog.csdn.net/icvpr
- #include <iostream>
- #include <opencv2/opencv.hpp>
- int main(int argc, char** argv)
- {
- cv::Mat image = cv::imread("../test.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- if (image.empty())
- {
- std::cout<<"read image failure"<<std::endl;
- return -1;
- }
- // 全局二值化
- int th = 100;
- cv::Mat global;
- cv::threshold(image, global, th, 255, CV_THRESH_BINARY_INV);
- // 局部二值化
- int blockSize = 25;
- int constValue = 10;
- cv::Mat local;
- cv::adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);
- cv::imshow("globalThreshold", global);
- cv::imshow("localThreshold", local);
- cv::waitKey(0);
- return 0;
- }
原圖:
全局固定閾值二值化結果(T = 100)
局部自適應閾值二值化結果(塊大小 = 25)
------------------------------------------------------- 轉自:http://blog.csdn.net/icvpr >
個人用的時候讀入圖片自己輸入,結果誤把路徑中的 / 輸入為 \ ,導致出錯,本人又是剛接觸,找了半天原因才找到。
二值化的效果是非常好的,比全局化閾值法好很多,然后只需把得到的圖片里面的噪聲去掉。本人用的圖片不便公布。