在圖像處理應用中二值化操作是一個很常用的處理方式,例如零器件圖片的處理、文本圖片和驗證碼圖片中字符的提取、車牌識別中的字符分割,以及視頻圖像中的運動目標檢測中的前景分割,等等。
較為常用的圖像二值化方法有: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)
[