Matlab watershed函数

L = watershed(A) 对输入矩阵 A 进行分水岭变换,并标记不同的分水岭区域,得到标签矩阵 L 。

A 可以是任意维度的矩阵。

L 中的元素是非负整数。

      值为 0 的元素不属于一个独立的分水岭区域,这些像素被称为“分水岭元素”;

      值为 1 的元素属于第一个分水岭区域;

      值为 2 的元素属于第二个分水岭区域;

      值为 3 的元素属于第三个分水岭区域;

      。。。

      以此类推。

默认情况下,对于二维输入图像,该函数采用 8 连接邻域,

                      对于三维输入图像,该函数采用 26 连接邻域,

                     对于更高维的输入图像,邻域大小由 conndef(ndims(A), 'maximal') 给出。

 

L =  watershed(A, CONN) 通过指定的邻域大小 CONN 对输入矩阵 A 进行分水岭变换,CONN可能有以下标量值:

4        二维 4 连接邻域

8        二维 8 连接邻域

6        三维 6 连接邻域

18      三维 18 连接邻域

26      三维 26 连接邻域

对于任意维度的矩阵,连接性可以用一种更一般的形式来定义,即通过一个只有 0 元素和 1 元素的 3×3×...×3 矩阵CONN来定义,其中,1 元素所在的位置就是CONN中心元素指定的邻域位置。这种情况下,CONN必须是关于中心对称的矩阵。

 

【注】A 可以是任意维度的数值矩阵或逻辑矩阵,但它必须是非稀疏的。L 是无符号整型的

 

例子:

1、A 是二维的

clear
% (1)创建一幅包含两个重叠的圆形物体的二值图像
center1 = -10;
center2 = -center1;
dist = sqrt(2*(2*center1)^2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius;
bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius;
bw = bw1 | bw2;
figure, imshow(bw,'InitialMagnification','fit'), title('bw')

% (2)对二值图像取反,并计算取反后的距离变换
D = bwdist(~bw);
figure, imshow(D,[],'InitialMagnification','fit')
title('Distance transform of ~bw')

% (3)对距离变换的结果取反,并强制非目标物体区域的像素值为无穷大
D = -D;
D(~bw) = Inf;

% (4)计算分水岭变换,强制背景像素为零,并将生成的标签矩阵显示为RGB图像
L = watershed(D); 
L(~bw) = 0;
rgb = label2rgb(L,'jet',[.5 .5 .5]);
figure, imshow(rgb,'InitialMagnification','fit')
title('Watershed transform of D')

 

 

 

 

2、A 是三维的

clear
% (1)创建一幅包含两个重叠球体的三维二值图像
center1 = -10;
center2 = -center1;
dist = sqrt(3*(2*center1)^2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y,z] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).^2 + (y-center1).^2 + ...
           (z-center1).^2) <= radius;
bw2 = sqrt((x-center2).^2 + (y-center2).^2 + ...
           (z-center2).^2) <= radius;
bw = bw1 | bw2;
figure, isosurface(x,y,z,bw,0.5), axis equal, title('BW')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud


% (2)计算距离变换
D = bwdist(~bw);
figure, isosurface(x,y,z,D,radius/2), axis equal
title('Isosurface of distance transform')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

% (3)对距离变换取反,强制非目标物体像素值为无穷大,然后计算分水岭变换
D = -D;
D(~bw) = Inf;
L = watershed(D);
L(~bw) = 0;
figure
isosurface(x,y,z,L==1,0.5)
isosurface(x,y,z,L==2,0.5), axis equal
title('Segmented objects')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值