您的位置:首页 > 编程语言 > MATLAB

迭代法求取阈值进行图像分割——MATLAB

2019-08-20 17:31 1971 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_33668060/article/details/99862626

@迭代法求取阈值进行图像分割

迭代法求取阈值进行图像分割

它的主要思想是:图像分割后的两部分A和B的均值和基本保持稳定。也就是说,随着迭代的进行,取 [mean(A)+mean(B)]/2 最终的收敛值作为分割阈值。

在这里有一点需要注意
为了提高收敛速度,初始阈值T0的选择要稍微注意些。当目标与背景的面积相当时,可以将初始阈值T0设置为整个图像的平均灰度值;当目标与背景的面积相差较大时,更好地选择是将初始阈值T0设置为最大灰度值和最小灰度值的中间值。

迭代算法:

  1. 选择一个初始阈值T0;
  2. 根据阈值T0将图像分为A和B两部分。分别求出A和B的平均灰度值A_average和B_average。
  3. 计算 T1= (A_average+B_average)/2 ,比较 abs(T1-T0)<1(或更小值),若果成立,则停止迭代,此时的T1就是分割阈值;否则,将T1赋值给T0(T0=T1),继续从第二步开始。

算法实现:

A = imread('rice.png');
figure;
subplot(121);imshow(A);title('原图')
T = mean2(A);   %取均值作为初始阈值
done = false;   %定义跳出循环的量
i = 0;
% while循环进行迭代
while ~done
r1 = find(A<=T);  %小于阈值的部分
r2 = find(A>T);   %大于阈值的部分
Tnew = (mean(A(r1)) + mean(A(r2))) / 2;  %计算分割后两部分的阈值均值的均值
done = abs(Tnew - T) < 1;     %判断迭代是否收敛
T = Tnew;      %如不收敛,则将分割后的均值的均值作为新的阈值进行循环计算
i = i+1;
end
A(r1) = 0;   %将小于阈值的部分赋值为0
A(r2) = 1;   %将大于阈值的部分赋值为1   这两步是将图像转换成二值图像

subplot(122);imshow(A,[]);title('迭代处理后')

处理结果:


该算法实现的处理结果,还是比较理想的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: