【问题标题】:Over-segmentation in the marker controlled watershed in MatlabMatlab中标记控制的分水岭中的过度分割
【发布时间】:2011-11-17 10:12:27
【问题描述】:

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

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

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

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 ')

结果如下图所示。


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

附加问题: 谢谢尤达提供了答案。但是,在这种情况下,使用“cityblock”的距离变换很好,但如果我们使用“euclidean”,则会导致过度分割。因为分水岭将取决于图像中的局部最小值,并且“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); 

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

请注意,在左图中,局部最小值显示为白色区域。可以观察到,聚类对象中仅显示了两个局部最小值。所以会带来好的结果。

现在让我们看看使用'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')

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

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

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

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

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

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

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

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


    解决方案 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')
    

    【讨论】:

    • @belisarius: inf 是无穷大 - 或者出于实际目的,一个非常大的数字。
    • 嗨尤达,谢谢你的回答。但是,在这种情况下,使用“cityblock”的距离变换很好,但如果我们使用“euclidean”,则会导致过度分割。如果我们更改为其他示例,它也会失败。请参阅我编辑的问题以获取更多详细信息。谢谢。
    • @Cheung 请看我的编辑,它回答了你关于基于标记的分水岭的问题:)
    【解决方案2】:

    这就是我在 Mathematica 中的做法。希望你能翻译。

    i1 = Binarize@Import["http://i.stack.imgur.com/qrYCL.jpg"];
    marker = Binarize@Import[  "http://i.stack.imgur.com/CMI6Z.jpg"]; 
    
    ImageMultiply[i1, WatershedComponents[i1, marker] // Colorize]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多