分水岭变换将图像视为浅色像素代表高海拔而深色像素代表低海拔的表面,从而在图像中找到“集水盆地”或“分水岭脊线”。 分水岭变换可用于将感兴趣的连续区域分割为不同的对象。
MATLAB图像处理主要是用到了watershed函数使用方法。
调用格式:
L = watershed(A)
返回一个标签矩阵L,该标签矩阵L标识输入矩阵A的分水岭区域。
L = watershed(A,conn)
指定在分水岭计算中使用的连通性。
close all; clear all; clc;
I=imread('circbw.tif');
J=watershed(I,8); %分水岭分割
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);
`
下一个阶段的要求:
01:计算二进制图像补码的距离变换。 输出图像中每个像素的值是该像素与bw最接近的非零像素之间的距离,距离变换生成;
02:然后进一步的,有对距离变换后的图像进行补充,以使分水岭变换的亮像素代表高海拔,而暗像素代表低海拔,实现高低的错落分布;
03:计算分水岭变换。 将ROI以外的像素设置为0。
04:将结果标签矩阵显示为RGB图像。
05:展示出来初步的二维效果。
center1 = -40;
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;
subplot(131);imshow(bw);
title('Binary Image with Overlapping Objects')
D = bwdist(~bw);
subplot(132);imshow(D,[]);
title('Distance Transform of Binary Image')
L = watershed(D);
L(~bw) = 0;
rgb = label2rgb(L,'jet',[.5 .5 .5]);
subplot(133);imshow(rgb);%生成rgb色图
title('Watershed Transform')