【图像处理】MATLAB:图像分割

阈值分割

全局阈值处理

% 迭代实现方式
T = 0.5*(double(min(f(:)))+double(max(f(:))));
done = false;
while ~done
    g = f>=T;
    Tnext = 0.5*(mean(f(g))+mean(f(~g)));
    done = abs(T - Tnext) < 0.5;
    T = Tnext;
end

局部阈值处理

  代码示例

f = imread('scanned-text-grayscale.tif');
T = graythresh(f);                          % 自动获取阈值
T = T*255;                                  % 阈值在区间[0,1],需调整至[0,255]
g = f<=T;
subplot(1,2,1);imshow(f);title('原图像');
subplot(1,2,2);imshow(g);title(['阈值处理,阈值为' num2str(T)]);

  运行结果


基于区域的分割

区域生长

区域分离和合并


使用分水岭变换的分割

使用距离变换的分水岭分割

  代码示例

f = imread('binary_dowel_image.tif');   % 二值图像
% g = im2bw(f,graythresh(f));           % 变换为二值图像的方法
gc = ~f;                                 
D = bwdist(gc);                         % 距离变换
L = watershed(-D);                      % 计算距离变换的负分水岭变换
w = L == 0;
g2 = f & ~w;                            % 黑色叠加在原图上后的分水岭脊线
% 一些对象并未正确分离,称之为过分割

subplot(3,2,1);imshow(f);title('原二值图像');
subplot(3,2,2);imshow(gc);title('图像的补');
subplot(3,2,3);imshow(D,[]);title('距离变换');
subplot(3,2,4);imshow(L,[]);title('负分水岭变换');
subplot(3,2,5);imshow(g2);title('分割结果');

  运行结果

使用梯度的分水岭分割

  代码示例

f = imread('small-blobs.tif');
fd = double(f);
h = fspecial('sobel');                          % 形态学梯度
g = sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2); % 梯度幅度
L = watershed(g);                               % 分水岭变换
wr = L ==0;                                     % 分水岭脊线

% 在计算分水岭变换前先平滑梯度图像
g2 = imclose(imopen(g,ones(3,3)),ones(3,3));    % 闭-开运算
L2 = watershed(g2);                             % 分水岭变换
wr2 = L2 ==0;
f2 = f;
f2(wr2) = 255;

subplot(2,2,1);imshow(f);title('原灰度级图像');
subplot(2,2,2);imshow(g,[]);title('梯度幅度图像');
subplot(2,2,3);imshow(wr);title('分水岭变换过分割');
subplot(2,2,4);imshow(f2);title('先平滑梯度图像再分水岭变换');

  运行结果

控制标记符的分水岭分割

  代码示例

f = imread('gel-image.tif');
fd = double(f);
h = fspecial('sobel');
g = sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2); % 梯度幅度
L = watershed(g);                               % 分水岭变换
wr = L ==0;                                     % 分水岭脊线
% 可以观察到部分由大量局部最小区域导致的过分割结果

rm = imregionalmin(g);
% 观察到多数局部最小区域位置非常浅,有许多于分割问题不相关的细节

im = imextendedmin(f,2);                         % 获取内部标记符集合
fim = f;                                        % 2为高度阈值
fim(im) = 175;
% 在原图像上以灰色气泡形式叠加扩展的局部最小区域位置

Lim = watershed(bwdist(im));                    % 获取外部标记符
em = Lim ==0;
% 显示em的分水岭脊线

g2 = imimposemin(g , im | em);                  % 强制最小技术
% 修改灰度级图像,以便局部最小区域仅出现在标记的位置

L2 = watershed(g2);
f2 = f;
f2(L2 ==0) = 255;
% 修改了标记符的梯度图像的分水岭脊线

subplot(3,3,1);imshow(f);title('原凝胶图像');
subplot(3,3,2);imshow(wr);title('分水岭变换过分割');
subplot(3,3,3);imshow(rm);title('梯度幅值的局部最小区域');
subplot(3,3,4);imshow(fim);title('内部标记符');
subplot(3,3,5);imshow(em);title('外部标记符');
subplot(3,3,6);imshow(g2,[]);title('修改后的梯度幅值');
subplot(3,3,8);imshow(f2);title('分割结果');

  运行结果


  • 38
    点赞
  • 291
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值