预迭代阈值分割:图像分割关键在于找到最佳阈值,通过迭代方式逼近最佳阈值,是图像分割的有效办法。
算法思路:
例如:1,99
取2,50,98都能分割1和99,但是50与1和99差别最大,为最佳阈值。可以看出两个数的中间值为最佳阈值。哪俩个部分呢?
例如:1,2,98,99
我们假设40作为阈值,得到1,2作为A部分,得到98,99作为B部分。A部分均值为1.5,B部分均值为98.5,中间值为50,50与假设值40误差过大,继续取50作于阈值重复上述步骤,得到50为最佳阈值。
但是,在图像中可不止上述几个数的存在。实际上,不停的划分阈值,其A与B部分的均值必然会不断改变,只能用逼近的方法,即设T1为分割阈值时,A与B部分均值的中间值为T2,若T1与T2的误差很小时,也就是T1约等于T2时,此时的T2或者T1就是最佳阈值。
程序如下:
close;clear;clc;
I=im2double(imread('coins.png')); %读入图像,转换为双精度类型
level=0.001; %预设两阈值之间的误差
max_I=max(I(:)); %得到最大灰度值
min_I=min(I(:)); %得到最小灰度值
T1=1/2*(max_I+min_I); %假设初始阈值
[M,N]=size(I); %得到图像行列数
A_number=0; %初始化A部分总像素值
B_number=0; %初始化B部分总像素值
A_all=0; %初始化A部分总灰度值
B_all=0; %初始化B部分总灰度值
for i=1:M
for j=1:N
if (I(i,j)>=T1)
A_number=A_number+1; %A部分总像素值
A_all=A_all+I(i,j); %A部分总灰度值
elseif (I(i,j)<T1)
B_number=B_number+1; %A部分总像素值
B_all=B_all+I(i,j); %B部分总灰度值
end
end
end
A_ave=A_all/A_number; %A部分灰度均值
B_ave=B_all/B_number; %B部分灰度均值
T2=1/2*(A_ave+B_ave); %A与B灰度均值的中间值,即新阈值
while (abs(T2-T1)>level) %判断T1与T2之间的误差绝对值是否大于设定值
T1=T2; %把T2赋给T1,反复重复上述程序,直到T2-T1的绝对值小于设定值为止
A_number=0;
B_number=0;
A_all=0;
B_all=0;
for i=1:M
for j=1:N
if (I(i,j)>=T1)
A_number=A_number+1;
A_all=A_all+I(i,j);
elseif (I(i,j)<T1)
B_number=B_number+1;
B_all=B_all+I(i,j);
end
end
end
A_ave=A_all/A_number;
B_ave=B_all/B_number;
T2=1/2*(A_ave+B_ave);
end %T1与T2之间的误差绝对值小于设定值时,跳出循环
T2*255
J=im2bw(I,T2); %把图像转换为二值图,进行阈值为T2的图像分割
figure(1);
subplot(121);imshow(I);
subplot(122);imshow(J);
|
|