我得到一张图片,也是图片中区域的边界。例如,我有一个逻辑类型的掩码,边界的值是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
根据上图,将会识别出四个区域。
答案 0 :(得分:4)
图像处理工具箱中的函数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像素连接。在使用代码之前,请确保您也反转输入。