【问题标题】:How to segment out the region of interest in this mask如何在这个掩码中分割出感兴趣的区域
【发布时间】:2015-06-01 01:36:01
【问题描述】:

您好,我得到了如下蒙版,我尝试分割左侧面板。

我使用了分水岭方法,所以希望它会为左侧面板返回一个值。

D = bwdist(~mask);
imshow(D,[],'InitialMagnification','fit');

Di = -D;
Di(~mask) = -Inf;
L = watershed(Di);
Lrgb = label2rgb(L,'jet');
imshow(Lrgb);

但是我得到了这个,任何人都可以帮助我,或者你在细分方面有更好的建议。

【问题讨论】:

  • 你试过eroding图片吗?我认为这应该可以让您将它们充分分开,以便 bwconncomp 实际上会返回 2 个对象。
  • @ABC 我在回答中这样做了。开口是先腐蚀后膨胀。
  • 是的,但是添加组件“line”只会添加更多不需要的处理,而直接在此图像上腐蚀是一种不太复杂的方法,应该可以得到所需的答案。此外,根据应用程序,可能不需要膨胀。不管怎样,给猫剥皮的方法有很多:)
  • @ABC 你会用什么来腐蚀图像?同意有很多方法可以做到这一点。如果您确实有更好的主意,我希望看到您发布答案。如果没有,不用担心。万事如意!
  • @rayryeng,我为您发布了答案。您基本上创建自己的自定义结构元素,而不是 matlab 的默认元素(ei、'disk'、'line' 等)并用它来腐蚀。这很简单。使用相同的蒙版分隔对象后,您可以向后扩展,并且页面将保持分离状态。我更喜欢这种方法,因为您对操作有更多的控制权,并且您对如何侵蚀或扩张有更直观的感觉,但在这种情况下,它并没有太大的区别——而且您的解决方案只执行以及:)

标签: matlab image-processing


【解决方案1】:

参考你的答案,使用bwconncomp当然是一种有效的方法,但这里的问题是,如果你看书的书脊,左右页是相连的。因此,如果您尝试按照您的建议进行操作,整本书将被标记为一个对象,而这可能不是您想要的。因此,我的建议是先分离页面,然后在完成后应用标签算法。

一个带有垂直线结构元素的简单形态开口过滤器应该可以解决问题。为了获得好的效果,我使用了长度为 100 的线。您还有一些不必要的边框像素,并且图像实际上是 RGB。因此,我将图像转换为二进制然后清除边框:

mask = imclearborder(im2bw(imread('http://i.stack.imgur.com/xUyDQ.png')));

我直接从 StackOverflow 读取了您的图片。接下来,我们将应用我所说的形态:

se = strel('line', 100, 90);
out = imopen(mask, se);

strel 的第二个输入是行的长度,因为 'line' 是您正在使用的标志 - 这表示一个行结构元素,第三个输入是行的方向。 90 表示 90 度,或一条垂直线。

接下来,我们可以使用bwlabel 代替bwconncomp... 不仅因为它使用起来更简单,而且速度更快。 bwlabel 为您提供了一个标签矩阵,用于标记图像中的每个唯一对象。对象按列优先顺序标记,因此从上到下,从左到右。

这意味着左边的页面将被赋予标签#1....所以你可以这样做来提取左边的页面:

left_page = label == 1;
imshow(left_page);

我们得到这张图片:

【讨论】:

    【解决方案2】:

    根据@rayryeng 的要求,这是一种非常简单的替代方法。

    im = imread('xUyDQ.png');
    im = im2bw(im); 
    im = imerode(im, ones(6));
    

    结果...

    向后扩张……

    im = imdilate(im, ones(6)); 
    figure, imshow(im)
    

    您当然可以通过将 6 减小到更小的值来获得更小的侵蚀。发生的事情是,我基本上是在使用一个自定义结构元素进行侵蚀,该元素是一个 6x6 的矩阵 - 实际发生的是边界上 6 个像素被更改为零,因此您可以在页面之间获得所需的分隔正在找。

    【讨论】:

    • 这个答案与我写的答案之间的唯一区别是您提供了不同的结构元素。 ones(6) 是一个方形结构元素,可以通过 se = strel('square', 6); 创建。我不会认为方形结构元素是“自定义”的。我写的答案与您在此处写的答案之间确实没有太大区别……只是您明确地将腐蚀和膨胀操作分开,而我将它们与开口结合在一起,但我离题了。很高兴在答案中看到您的想法。祝你好运!
    • 啊,我应该事先查看 imopen 的 .m 文件——你说得对,它只是腐蚀+扩张! ...我认为功能的细节还有更多。我之前用过它,但后来改用单独使用它们,因为我并不总是希望两个函数都使用相同的结构元素——而且使用“正方形”和“圆盘”似乎太神奇了,我喜欢看到理论多一点。无论如何,很酷,总是很有趣地了解comp vision :)
    • 啊,是的,很公平。其实你的心态是对的。坚持下去!..是的。深入研究计算机视觉总是很有趣:) 既然我知道你来自哪里,我已经赞成你的答案。干得好!
    【解决方案3】:

    我实际上发现有一个 matlab 函数 bwconncomp 可以标记组件。

    components = bwconncomp(mask);
    c_ind = components.PixelIdxList;
    

    【讨论】:

    • 您确定这会将两个页面分开吗?不是简单地将左右页面作为一个标签吗?当您查看中间(书脊)时,这些页面实际上是相连的。我现在实际上正在写一些东西,不仅可以分隔页面,还可以标记它们(通过bwconncomp / bwlabel)。
    • 哈哈。谢谢:)...只是很多经验。我每天都在处理图像处理问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 2015-01-08
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多