首页 文章

Matlab中标记控制流域的过分割

提问于
浏览
7

我在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”应用于其他图片,也会导致过度细分 . 现在让我们看看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 回答

  • 3

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

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

    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

  • 8

    这就是我在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]
    

    enter image description here

相关问题