圖像閾值分割不管在視覺檢測領域仍是在識別領域都是一個很是關鍵一步。因爲項目的須要最近要對圖像分割進行一個研究。圖像分割中的閾值包括Global threshold和Local threshold,對於Global threshold 目前比較成熟,比較好的包括OTSU,迭代方法選取閾值,直方圖迭代等都是比較好的自適應閾值方法,可是Global threshold有個比較大的缺點是當遇到光照不均(illumination)或噪聲嚴重時,好比一些低分辨率的文檔圖像,其效果不理想。算法
下面主要介紹Local threshold的一些算法;windows
1、Bensen的算法ui
Bersen的算法很簡單,是經過計算局部窗口內最大maxVal和最小minVal灰度值,而後計算出閾值 Tblog
T = (maxVal + maxVaL)/ 2文檔
缺點也很明顯,分割後的圖像背景區域會出現不少噪聲干擾。博客
2、Niblack的算法io
Niblack算法的主要思想是:經過計算窗口的平均值 m 和方差 s來估算當前像素的閾值。經過公式描述 程序
k取 0.2 ~ 0.5,因爲是在局部窗口內計算出來的結果,不可避免分割後的圖像會在背景去產生不少噪聲干擾。 自適應
matlab 程序以下方法
I = imread('card3.bmp');
I = rgb2gray(I);
w = 2;%
max = 0;
min = 0;
[m,n] = size(I);
T = zeros(m ,n );
for i = (w + 1):(m - w)
for j = (w + 1):(n - w)
sum = 0;
for k = -w:w
for l = -w:w
sum = sum + uint32(I(i + k,j + l));
end
end
average = double(sum) /((2*w+1)*(2*w+1));
s = 0;
for k = -w:w
for l = -w:w
s = s + (uint32(I(i + k,j + l)) - average)*(uint32(I(i + k,j + l)) - average);
end
end
s= sqrt(double(s)/((2*w+1)*(2*w+1)));
T(i,j) = average + 0.2*s;
end
end
for i = 1:m
for j = 1:n
if I(i,j) > T(i,j)
I(i,j) = uint8(255);
else
I(i,j) = uint8(0);
end
end
end
imshow(I);
3、Sauvola的算法
Sauvola算法是在Niblack上的改進
m表明窗口內的平均灰度,R爲全局標準方差的最大值,通常R=128,k取 0.2 ~ 0.5,s爲當前窗口的方差。
Sauvola算法在背景和前景對比度較高時分割效果較好,好比字符分割中字符灰度值爲0,背景值爲255,其分割具備較好的效果。若是前景和背景對比度較差,則分割效果不佳。
4、Christian(or Wolf)的算法
克服Sauvola的算法的缺點,Christian的方法對窗口內的灰度均值和方差進行規範化,新的算法公式描述以下:
其中,M爲全圖圖像最小灰度值,m表明窗口內的平均灰度,R爲全部局部窗口的最大值標準方差值,k取0.5,,改方法與前兩種Local threshold方法相比,效果最好。對於背景和前景對比度不高的狀況改方法效果較好,可是因爲R和M的值來源於全局圖像,圖像中一個小的噪聲都會對R和M產生較大影響,另外當不一樣區域的光照不均太厲害也會對閾值分割產生較大的影響,因此下降了局部閾值的穩定性。
5、Meng-Ling Feng的算法
針對來Christian的算法存在的問題,來自南洋理工大學的Feng等同窗,提出的新的算法。Feng增長了第二Local windows,R的計算在第二Local windows中進行,而不是在全局圖像中計算,提升了抗光照不均的能力,而且方法中採用5x5的中值濾波提升算法的抗噪能力。公式描述以下:
其中
根據經驗,。
6、實驗結果