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

动态阈值进行图像分割——MATLAB

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

@ 采用动态阈值进行图像分割

由于在进行图像处理的过程中,当图像中目标的灰度处于不同的灰度域中,单独使用一个全局阈值,可能无法全面的提取所有目标,这时可以采用动态阈值的处理方法,将图像分成多个块,分别对每个块进行操作。

下面一段代码,是将图像rice.png分割成16块,对每一块单独的采用迭代法进行处理,当16块都处理结束后,将其合并,即为所要的处理结果。

代码实现:

A = imread('rice.png');
figure;
subplot(121);imshow(A);title('原图')
[m,n] = size(A);
% A1 = A(1:m/4,1:n/4);
% A2 = A(m/4+1:m/3,1:n/4);
M = 64;
N = 64;
B = mat2cell(A,ones(m/M,1)*M, ones(n/N,1)*N); %将矩阵A分成16块,每块的大小为64×64

%分别对每一块矩阵进行处理
for i=1:4
for j=1:4
T = mean2(B{i,j});   %取均值作为初始阈值
done = false;   %定义跳出循环的量
a = 0;
% while循环进行迭代
while ~done
r1 = find(B{i,j}<=T);  %小于阈值的部分
r2 = find(B{i,j}>T);   %大于阈值的部分
Tnew = (mean(B{i,j}(r1)) + mean(B{i,j}(r2))) / 2;  %计算分割后两部分的阈值均值的均值
done = abs(Tnew - T) < 1;     %判断迭代是否收敛
T = Tnew;      %如不收敛,则将分割后的均值的均值作为新的阈值进行循环计算
a = a+1;
end
B{i,j}(r1) = 0;   %将小于阈值的部分赋值为0
B{i,j}(r2) = 1;   %将大于阈值的部分赋值为1   这两步是将图像转换成二值图像
end
end
J = cell2mat(B); %将分块处理后的矩阵转换成整个矩阵
subplot(122);imshow(J,[]);title('动态阈值+迭代')

处理结果:


从这里的处理结果,与前面两篇采用全局阈值的处理结果相比较,可以发现,采用动态阈值的方法,效果更好。

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