本示例说明了如何使用分水岭分割来分离图像中的物体。分水岭变换通过将图像视为亮像素高而暗像素低的表面,在图像中找到“集水盆地”和“分水岭脊线”。
如果您可以识别或“标记”前景物体和背景位置,则使用分水岭变换进行分割会更好。标记控制的分水岭分割遵循以下基本过程:
- 计算分割函数。这是一张图像,其暗区是您要分割的物体。
- 计算前景标记。这些是每个物体中像素的连通域。
- 计算背景标记。这些是不属于任何物体的像素。
- 修改分割函数,使其仅在前景和背景标记位置具有最小值。
- 计算修改后的分割函数的分水岭变换。
步骤1:读取彩色图像并将其转换为灰度
rgb = imread('pears.png');
I = rgb2gray(rgb);
imshow(I)
text(732,501,'Image courtesy of Corel(R)',...
'FontSize',7,'HorizontalAlignment','right')
步骤2:使用梯度幅度作为分割函数
计算梯度幅度。梯度在物体边界处较高,而在物体内部的梯度较低(大部分)。
gmag = imgradient(I);
imshow(gmag,[])
title('Gradient Magnitude')
您是否可以直接在梯度幅度上使用分水岭变换对图像进行分割?
L = watershed(gmag);
Lrgb = label2rgb(L);
imshow(Lrgb)
title('Watershed Transform of Gradient Magnitude')
不行。如果不进行其他预处理(例如下面的标记计算),则直接使用分水岭变换通常会导致“过度分割”。