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