给定图像区域的边界,执行图像分割

3
我可以翻译这段内容。这是关于IT技术的内容。

我有一张图片和该图像中区域的边界。例如,我有一个逻辑类型的掩膜,边界的值为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

根据上图,将会识别出四个区域。

1个回答

5
图像处理工具箱中的函数bwlabel是您应该使用的理想函数,用于标记二进制掩模中每个连续的非零像素区域。但是,您希望对“边界”像素所标识的像素执行此操作。因此,只需使用二进制掩模的反向操作,以便您在零像素上进行操作而不是非零像素上进行操作。此外,根据您的定义,通过4像素连接将区域分隔开来。默认情况下,bwlabel在搜索连续区域时使用8像素连接,这意味着它在N、NE、E、SE、S、SW、W和NW方向上查找。您需要手动指定4像素连接,它仅在N、E、S和W的方向上查找。

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

labels = bwlabel(~L, 4);

输出的标签是一个地图,告诉您每个像素的成员资格。相同成员资格的区域告诉您这些像素属于同一组。
使用您的示例,我们得到:
>> 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的像素属于同一岛屿或区域。 如果您不想使用从头开始做这件事,您可以参考我的先前帖子,使用深度优先搜索来查找连接组件的区域: 如何在Matlab中找到二进制图像中的所有连接组件?。请注意,这不是高效的代码,因此您应该仅将其用于教育和研究目的。建议使用,因为它是一个快速的函数,并经过良好测试。您还需要修改代码,以便它不会在8像素连接中进行搜索,而只应查看4像素连接。在使用代码之前,请确保反转输入。

谢谢你的回答!但是,我的问题是将连通组件标记为值0,而不是1。因此,在这个例子中,应该有4个区域的4个标签。我认为我可以通过递归解决这个问题,但不确定它的样子。你有什么想法吗? - user3919259
只需对图像的反转执行相同的过程即可。因此,使用~L调用该函数。您还需要指定4个像素连接。这样,值为0的像素将成为感兴趣的像素,而值为1的像素将分离那些非零像素。这是您要找的吗?如果是这种情况,我很乐意编辑我的答案。实际上,根据您说有4个区域,我相信这是正确的答案。 - rayryeng
@user3919259 根据您的评论,我已经编辑了我的帖子。我相信这就是您想要的。祝你好运。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接