gpt4 book ai didi

matlab - Matlab 中标记控制分水岭的过度分割

转载 作者:太空宇宙 更新时间:2023-11-03 19:23:32 25 4
gpt4 key购买 nike

我在 Matlab 中实现标记控制的分水岭时遇到问题。

输入图像是具有两个聚类对象的二进制掩码。另一个图像是另一个二值图像,其中白色区域表示标记。

image marker

然后我尝试使用标记控制的分水岭来分割聚类对象。代码如下:

bw=imread('Im.jpg'); % read image
bwMarker=imread('Marker.jpg');% read marker
bw(bwMarker)=0; % impose the marker on the image
L=watershed(bw);% do the watershed
%% plot
rgb = label2rgb(L,'jet',[.5 .5 .5]);
figure(2), imshow(rgb,'InitialMagnification','fit')
title('Marker Controlled Watershed transform ')

结果如图所示。

enter image description here
它将物体一分为二,但形状并不完整。我想获得整个对象,但只是将两者分开的一条线(如下所示)有人可以帮我吗?谢谢。

enter image description here

附加问题:感谢 yoda 提供了答案。然而,在这种情况下,使用“cityblock”的距离变换很好,但如果我们使用“euclidean”,则会导致过度分割。因为分水岭将取决于图像中的局部最小值,并且“cityblock”距离变换产生正确数量的局部最小值是巧合的。如果我们对其他图像应用“cityblock”,它也会导致过度分割。现在让我们看看 yoda 的代码:

img=im2bw(imread('http://i.stack.imgur.com/qrYCL.jpg'));

imgDist=-bwdist(~img,'cityblock');
imgDist(~img)=-inf;

% check local minimums
BW = imregionalmin(imgDist);
figure(1), imshow(BW);
title('Regional Minima in Original Image');

imgLabel=watershed(imgDist);

局部最小值和结果如下所示:

enter image description here enter image description here

请注意,在左图中,局部最小值显示为白色区域。据观察,聚类对象中仅显示两个局部最小值。因此导致了良好的结果。

现在让我们看看使用“euclidean”的距离变换。

imgDist=-bwdist(~img);
imgDist(~img)=-inf;

% check local minimums
BW = imregionalmin(imgDist);
figure(1), imshow(BW);
title('Regional Minima in Original Image');

imgLabel=watershed(imgDist);

imshow(imgLabel==0,'InitialMagnification','fit')

局部最小值和结果如下所示:

enter image description here enter image description here

请注意,在左图中,局部最小值显示为白色区域。观察到在聚类对象区域中显示出许多局部最小值。所以这会导致过度分割的结果。

过分割是因为分水岭会先检查图像中的局部最小值,然后根据局部最小值进行分水岭。请注意,如果局部最小值比所需的分割对象太多,则会导致过度分割。提出了标记控制的分水岭来代替原来的局部最小值并获得更好的结果(因为每个标记将代表一个所需的分割对象)。但我不知道如何施加“标记”,使原来的局部最小值被压低,图像只有“标记”指定的局部最小值。谢谢。

最佳答案

解决方案 2:使用基于标记的分水岭:

您可以使用函数 imimposemin 强制局部最小值位于您的标记所在的位置。您需要稍微修改下面解决方案 1 中的代码,将第一行 imDist... 替换为

imgDist=-bwdist(~img);
imgDist=imimposemin(imgDist,marker);

其余代码相同。你应该得到如下的分割:

enter image description here


解决方案 1:使用曼哈顿距离:

这是 MATLAB 中的一个解决方案,可将您的两个集群分开:

img=im2bw(imread('http://i.stack.imgur.com/qrYCL.jpg'));

imgDist=-bwdist(~img,'cityblock');
imgDist(~img)=-inf;
imgLabel=watershed(imgDist);

imshow(imgLabel==0,'InitialMagnification','fit')

enter image description here

关于matlab - Matlab 中标记控制分水岭的过度分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com