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

use*_*259 3 matlab image image-processing image-segmentation

我得到一个图像以及图像中区域的边界。例如,我有一个逻辑类型的蒙版,boundary的值为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
Run Code Online (Sandbox Code Playgroud)

使用上面的图,将可以识别四个区域。

ray*_*ica 5

该函数bwlabel从图像处理工具箱是应该使用标记的非零像素的每一连续区域中的二元掩模理想的功能。但是,您要对设置为1的“边界”像素所描绘的像素执行此操作。因此,只需使用二进制掩码的反数,这样您就可以对零像素而不是非零像素进行操作。零像素。同样根据您的定义,使用4像素连接来分隔区域。 bwlabel默认情况下,搜索连续区域时使用8像素连通性,这意味着它沿N,NE,E,SE,S,SW,W和NW方向看。您需要手动指定4像素连通性,该连通性仅在N,E,S和W方向上看。

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

labels = bwlabel(~L, 4);
Run Code Online (Sandbox Code Playgroud)

输出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
Run Code Online (Sandbox Code Playgroud)

每个零岛都有一个唯一的ID,其中属于同一ID的像素属于同一岛或区域。如果您不想使用bwlabel并且是从第一原理开始的,则可以参考我以前的使用“深度优先搜索”的文章来查找连接组件的区域:如何在Matlab中以二进制映像查找所有连接的组件?。请注意,这不是有效的代码,因此您仅应将其用于教育和研究目的。bwlabel建议使用它,因为它是一种快速功能,并且经过了良好的测试。您还必须修改代码,以便它不会以8像素的连通性进行搜索,而只能查看4像素的连通性。在使用代码之前,请确保还反转输入。