【问题标题】:do image segmentation given the boundary of regions in the image给定图像中区域的边界进行图像分割
【发布时间】:2016-10-08 05:13:44
【问题描述】:

我得到一张图像以及图像中区域的边界。例如,我有一个逻辑类型的掩码,边界的值为1,而对于其他像素,值为0。我想标记由边界分割的区域,而我不知道如何分割和标记基于连续边界的区域。

边界是这样的:

0 0 0 1 0 0 0 1 0 0 
0 0 1 0 0 0 0 1 0 0
1 1 0 1 0 0 0 1 0 0
0 0 0 0 1 0 1 0 0 0

根据上图,将确定四个区域。

【问题讨论】:

    标签: image matlab image-processing image-segmentation


    【解决方案1】:

    图像处理工具箱中的函数bwlabel 是理想的函数,您应该使用它来标记二进制掩码中每个非零像素的连续区域。但是,您希望在由设置为 1 的“边界”像素描绘的 像素上执行此操作。因此,只需使用二进制掩码的反转,以便您在零像素而不是非零像素。同样根据您的定义,区域使用 4 像素连接来分隔。 bwlabel 在搜索连续区域时默认使用 8 像素连接,这意味着它在 N、NE、E、SE、S、SW、W 和 NW 方向上查找。您需要手动指定 4 像素连接,它只查看 N、E、S 和 W 方向。

    假设您的掩码存储在变量L 中,只需执行以下操作:

    labels = bwlabel(~L, 4);
    

    输出labels 将是一张地图,告诉您每个像素的成员资格。相同成员的区域告诉您这些像素属于同一组。

    使用您的示例,我们得到:

    >> L = [0 0 0 1 0 0 0 1 0 0 
            0 0 1 0 0 0 0 1 0 0
            1 1 0 1 0 0 0 1 0 0
            0 0 0 0 1 0 1 0 0 0];
    >> labels = bwlabel(~L, 4)
    
    labels =
    
         1     1     1     0     3     3     3     0     4     4
         1     1     0     3     3     3     3     0     4     4
         0     0     2     0     3     3     3     0     4     4
         2     2     2     2     0     3     0     4     4     4
    

    每个零岛都有一个唯一的 ID,其中属于同一 ID 的像素属于同一岛或区域。如果您不想使用bwlabel 并从第一原则做到这一点,您可以参考我之前使用深度优先搜索查找连接组件区域的帖子:How to find all connected components in a binary image in Matlab?。请注意,这不是有效的代码,因此您只能将其用于教育和研究目的。推荐使用bwlabel,因为它是一个快速的函数并且经过了很好的测试。您还必须修改代码,使其不会在 8 像素连接中搜索,它应该只查看 4 像素连接。确保在使用代码之前也反转输入。

    【讨论】:

    • 感谢您的回答!同时,我的问题是用值 0 标记连接的组件,而不是 1。因此,在示例中,4 个区域应该有 4 个标签。我想我可以通过递归来解决这个问题,但不确定它的样子。你有什么想法吗?
    • 然后在图像的反面执行相同的过程。所以用~L 调用函数。您还需要指定 4 像素连接。这样,0 的值成为感兴趣的像素,而 1 的值将那些非零像素分开。这是你要找的吗?如果是这种情况,我很乐意编辑我的答案。事实上,从你说的有 4 个区域来看,我相信这对你来说是正确的答案。
    • @user3919259 我已经根据您的 cmets 编辑了我的帖子。我相信这就是你想要的。祝你好运。
    猜你喜欢
    • 2018-09-06
    • 2017-07-11
    • 2011-05-18
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多