如何使用matlab应用分水岭来分割图像?

信息处理 图片 matlab 图像处理
2022-01-10 01:42:58

在此处输入图像描述

如何使用分水岭分割此图像以仅检索图像中的人?

到目前为止,我已经做了以下事情:

  1. 计算梯度

在此处输入图像描述

  1. 计算分水岭变换

在此处输入图像描述

我的代码:

  clear;
I=imread('inpaint.jpg');
I=rgb2gray(I);

hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);


figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)')
L = watershed(gradmag);
% Lrgb = label2rgb(L);
 figure, imshow(L), title('Watershed transform of gradient magnitude (Lrgb)')

我已成功申请分水岭

在此处输入图像描述

想知道我可以在原始图像中勾勒出我的对象,使其看起来是分段的吗?

2个回答

回想一下,分水岭变换将其输入视为地形图,并模拟用水淹没该地形。“集水盆地”或“分水岭地区”是地图中“蓄水”而不会溢出到其他地区的部分。

梯度幅度按原样是一个很差的分割函数;噪声和开放轮廓会导致图像过度分割。我们可以尝试一系列形态学操作,以创建近似的前景和背景标记,并使用它们来去除渐变的虚假部分。

%# Normalize.
g = gradmag - min(gradmag(:));
g = g / max(g(:));

th = graythresh(g); %# Otsu's method.
a = imhmax(g,th/2); %# Conservatively remove local maxima.
th = graythresh(a);
b = a > th/4; %# Conservative global threshold.
c = imclose(b,ones(6)); %# Try to close contours.
d = imfill(c,'holes'); %# Not a bad segmentation by itself.
%# Use the rough segmentation to define markers.
g2 = imimposemin(g, ~ imdilate( bwperim(a), ones(3) );
L = watershed(g2);

这工作正常。您将两组人和他们的阴影作为区域,并带有一点噪音。

你能详细说明你的目标吗?也就是说,您会分割许多不同的图像还是只分割与此示例高度相似的图像?您是否需要忽略阴影并将两个重叠的人分开?

如果您回答这些问题,我将尝试更新答案。

分割叠加

您问如何覆盖细分。一种方法是使用分水岭线来指定原始像素并将它们设置为明亮的颜色。

boundaries = L == 0;
I(boundaries) = 255;

您可以使用函数 bwperim 这里有一些很好的例子 http://blogs.mathworks.com/steve/2006/06/02/cell-segmentation/