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

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

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

下面一段代码,是将图像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('动态阈值+迭代')

处理结果:

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

发布了15 篇原创文章 · 获赞 5 · 访问量 4390

猜你喜欢

转载自blog.csdn.net/qq_33668060/article/details/99873919