局部自適應閾值則是根據像素的鄰域塊的像素值分佈來確定該像素位置上的二值化閾值。這樣做的好處在於每個像素位置處的二值化閾值不是固定不變的,而是由其周圍鄰域像素的分佈來決定的。亮度較高的圖像區域的二值化閾值通常會較高,而亮度較低的圖像區域的二值化閾值則會相適應地變小。不同亮度、對比度、紋理的局部圖像區域將會擁有相對應的局部二值化閾值。常用的局部自適應閾值有:1)局部鄰域塊的均值;2)局部鄰域塊的高斯加權和。
void adaptiveThreshold(srcgray,dstimage,maxVal,adaptiveMethod,thresholdType,blockSize,
constValue);
maxVal:預設最大值,使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值.
adaptiveMethod:自適應閾值算法選擇,自適應閾值算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C .
thresholdType:閾值類型,必須是CV_THRESH_BINARY或者CV_THRESH_BINARY_INV
blockSize:閾值的象素鄰域大小: 3, 5, 7, ...
對於max_value中的兩個方式中的T是爲每一個象素點單獨計算的閾值,即每個像素點的閾值都是不同的,就是將該像素點周圍B*B區域內的像素加權平均然後減去一個常數param,從而得到該點的閾值。b由block_size指定,常數由param1指定
對方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出塊中的均值,再減掉param。
對方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,那麼區域中(x,y)周圍的像素根據高斯函數按照他們離中心點的距離進行加權計算, 再減掉param。
int main(int argc, char** argv)
{
Mat image = imread("E:/VS2013/face/xuelian/png/1.png", CV_LOAD_IMAGE_GRAYSCALE);
if (image.empty())
{
cout << "read image failure" << endl;
return -1;
}
// 全局二值化
int th = 100;//閾值
Mat global;
threshold(image, global, th, 255, CV_THRESH_BINARY_INV);
// 局部二值化
int blockSize = 7;
int constValue = 11;
Mat local;
adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);
imshow("globalThreshold", global);
imshow("localThreshold", local);
waitKey(0);
return 0;
}