首页 > 代码库 > 图像分割
图像分割
图像阈值分割无论在视觉检测领域还是在识别领域都是一个非常关键一步。由于项目的需要最近要对图像分割进行一个研究。图像分割中的阈值包括Global threshold和Local threshold,对于Global threshold 目前比较成熟,比较好的包括OTSU,迭代方法选取阈值,直方图迭代等都是比较好的自适应阈值方法,但是Global threshold有个比较大的缺点是当遇到光照不均(illumination)或噪声严重时,比如一些低分辨率的文档图像,其效果不理想。
下面主要介绍Local threshold的一些算法;
一、Bensen的算法
Bersen的算法很简单,是通过计算局部窗口内最大maxVal和最小minVal灰度值,然后计算出阈值 T
T = (maxVal + maxVaL)/ 2
缺点也很明显,分割后的图像背景区域会出现很多噪声干扰。
二、Niblack的算法
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);
三、Sauvola的算法
Sauvola算法是在Niblack上的改进
m代表窗口内的平均灰度,R为全局标准方差的最大值,一般R=128,k取 0.2 ~ 0.5,s为当前窗口的方差。
Sauvola算法在背景和前景对比度较高时分割效果较好,比如字符分割中字符灰度值为0,背景值为255,其分割具有较好的效果。如果前景和背景对比度较差,则分割效果不佳。
四、Christian(or Wolf)的算法
克服Sauvola的算法的缺点,Christian的方法对窗口内的灰度均值和方差进行规范化,新的算法公式描述如下:
其中,M为全图图像最小灰度值,m代表窗口内的平均灰度,R为所有局部窗口的最大值标准方差值,k取0.5,,改方法与前两种Local threshold方法相比,效果最好。对于背景和前景对比度不高的情况改方法效果较好,但是由于R和M的值来源于全局图像,图像中一个小的噪声都会对R和M产生较大影响,另外当不同区域的光照不均太厉害也会对阈值分割产生较大的影响,所以降低了局部阈值的稳定性。
五、Meng-Ling Feng的算法
针对来Christian的算法存在的问题,来自南洋理工大学的Feng等同学,提出的新的算法。Feng增加了第二Local windows,R的计算在第二Local windows中进行,而不是在全局图像中计算,提高了抗光照不均的能力,并且方法中采用5x5的中值滤波提高算法的抗噪能力。公式描述如下:
其中
根据经验,。
六、实验结果
图像分割