本文为博主原创,转载请注明出处:
迭代法首先选择一个近似阈值T,将图像分割成两部分R1和R2,计算区域R1和R2的均值μ1和μ2,选择新的分割阈值T = (μ1 + μ2)/2 ,重复上述步骤知道μ1和μ2(或T)不再变化为止。这里我已经将迭代法写成了函数,直接调用就可以了。函数源代码如下:
function [ TK ] = diedai( I )
% 图像分割之迭代法获取阈值
% 形参I为原始图像灰度图,返回值为阈值
I = imread('rice.jpg');
ZMAX = max(I);%取出最大灰度值
ZMIN = min(I);%取出最小灰度值
TK = (ZMAX+ZMIN)/2;%初始阈值
BCal = 1;
iSize = size(I);%图像大小
while (BCal)
%定义前景和背景数
iForeground = 0;
iBackground = 0;
%定义前景和背景灰度总和
ForegroundSUM = 0;
BackgroundSUM = 0;
for i = 1:iSize(1)
for j = 1:iSize(2)
tmp = I(i,j);
if tmp >= TK
%前景灰度值
iForeground = iForeground + 1;
ForegroundSUM = ForegroundSUM + double(tmp);
else
iBackground = iBackground + 1;
BackgroundSUM = BackgroundSUM + double(tmp);
end
end
end
%计算前景和背景的平均值
ZO = ForegroundSUM/iForeground;
ZB = BackgroundSUM/iBackground;
TKtemp = uint8((ZO + ZB)/2);%新的阈值
if TKtemp == TK
BCal = 0;
else
TK = TKtemp;
end
%当阈值不再变化时,迭代结束
end
disp(strcat('迭代后的阈值:',num2str(TK)));
end 灰度图。
下面简单说下怎么调用,只有一点需要注意,迭代法操作对象为灰度矩阵,不是灰度图的要先转为灰度图。代码如下:
I1 = imread('rice.jpg');
I = rgb2gray(I1);
TK = diedai(I);
newI = imbinarize(I,double(TK/255));
我这里的‘rice.jpg’图片不是灰度图,所以就要先转为灰度图。
效果图我就不放了。图像分割的方法有很多,所以并不是所有的图都适合用迭代法来分割,有的图甚至效果还会非常差,所以想要获得好的分割效果只能不断尝试好的方法。所以,加油吧!我也是刚学,写的不好请见谅!