【问题标题】:extracting leaf after watershed segmentation in matlab在matlab中分水岭分割后提取叶子
【发布时间】:2015-09-04 08:16:41
【问题描述】:

应用分水岭分割后,我想从图像中提取剩余的叶子,并且只想得到像 image-2 这样没有背景的叶子。请你帮帮我。非常感谢。我还在下面附上了我的代码。 我是stackoverflow的新手,因此我不允许发布图像。我在mathworks中问过同样的问题,如果你愿意的话,你可以从那里检查图像。

提前非常感谢。

http://www.mathworks.com/matlabcentral/answers/237106-extracting-leaf-from-background

image-1:分水岭分割后(彩色版):

image-2: 图像是;

我的代码:

% I -- intensity image
  % Gmag -- gradient mag.
      se = strel('disk', 30);
Ie = imerode(I, se);
Iobr = imreconstruct(Ie, I);
figure
imshow(Iobr), title('Opening-by-reconstruction (Iobr)')
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
figure
imshow(Iobrcbr), title('Opening-closing by reconstruction (Iobrcbr)')
fgm = imregionalmax(Iobrcbr);
figure
imshow(fgm), title('Regional maxima of opening-closing by reconstruction (fgm)')
% modify area 
I2 = I;
I2(fgm) = 255;
figure
imshow(I2), title('Regional maxima superimposed on original image (I2)')
se2 = strel(ones(10,10));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
fgm4 = bwareaopen(fgm3, 100);
I3 = I;
I3(fgm4) = 255;
figure
imshow(I3)
title('Modified regional maxima superimposed on original image (fgm4)')
% background markers
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
figure
imshow(bw), title('Thresholded opening-closing by reconstruction (bw)')
D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
figure
imshow(bgm), title('Watershed ridge lines (bgm)')
gradmag2 = imimposemin(Gmag, bgm | fgm4);
L = watershed(gradmag2);
I4 = I;
I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255;
figure
imshow(I4)
title('Markers and object boundaries superimposed on original image (I4)')
Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');
figure
imshow(Lrgb)
title('Colored watershed label matrix (Lrgb)')
figure
imshow(I)
hold on
himage = imshow(Lrgb);
himage.AlphaData = 0.3;
title('Lrgb superimposed transparently on original image')


props = regionprops(L);
[~,ind] = max([props.Area]);
imshow(L == ind);

【问题讨论】:

  • ...那么您的问题到底是什么?我不明白你到底想要什么。
  • 应用分水岭后,我得到了 L 矩阵(按区域划分)。然后我想提取你在第一张图片中看到的目标叶子,最大的一个。接下来,我想要一个只有目标叶子和黑色背景的图像,如 image-2。如您所见,image-2 只有要提取的叶子。我希望我解释得更好。
  • 可以上传原图吗?你打算使用分水岭吗?恕我直言,有更好的算法来做这个
  • 暂时不允许上传图片,但您可以从下面的链接下载。其次,Grabcut其实比这个分水岭分割要好,但是需要交互,我需要在matlab中自动完成。如果您向我推荐任何其他算法,我将不胜感激。图片:(i.imgur.com/OUXuZj5.jpg)
  • 是的。链接在哪里?

标签: matlab image-processing image-segmentation watershed


【解决方案1】:
  • 无法根据分割后的图像提取叶子,因为黄色分量将叶子分割成不同的部分。
  • 此外,根据源代码,我了解到您使用的基本分水岭会产生过度分割。使用受约束的分水岭,也称为带标记的分水岭。
  • 想办法共享原始图像和处理后的图像。

【讨论】:

  • 不,我使用标记分水岭,而不是基本分水岭。有什么解决过度分割问题的建议吗?另外,即使你解决了这个问题,我怎样才能像第二张图像一样提取图像?
  • 另外,这里是orjinal图片的链接:
  • 您的结果显示了许多区域,这意味着您使用了许多内部标记。由于您只需要一片叶子,因此您只需要使用一个内部标记(以及您想要的尽可能多的外部标记)。然后,您将只有一个区域。
  • 我将叶子标记的数量减少到一个,但结果没有改变,目标叶子上仍然存在很多区域。
  • 是否可以分享您的意思的代码,谢谢
【解决方案2】:

我确认您使用的分水岭肯定存在问题。我在我自己的库上运行了你的代码,我使用了:一个内部标记(最大的组件,因此角上的叶子被丢弃),一个外部(内部膨胀),渐变图像。

这是我的结果:www.thibault.biz/StackOverflow/ResultLeaf.png。所以只有一个组件,因为我只使用一个内部标记。它并不完美,但已经更接近和更容易进行后期处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2016-07-31
    • 2012-07-11
    • 2011-09-08
    • 2016-12-29
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多