Image 在给定图像区域边界的情况下进行图像分割

Image 在给定图像区域边界的情况下进行图像分割,image,matlab,image-processing,image-segmentation,Image,Matlab,Image Processing,Image Segmentation,我得到了一张图像,还有图像中区域的边界。例如,我有一个逻辑类型的掩码,边界的值是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的“边界”

我得到了一张图像,还有图像中区域的边界。例如,我有一个逻辑类型的掩码,边界的值是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的“边界”像素所描绘的像素执行此操作。因此,只需使用二进制掩码的倒数,就可以对零像素而不是非零像素进行操作。此外,根据您的定义,使用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的像素属于相同的岛或区域。如果您不想使用
bwlabel
并根据第一原则执行此操作,您可以参考我以前的文章,使用深度优先搜索查找连接组件的区域:。请注意,这不是有效的代码,因此您应该仅将其用于教育和研究目的。建议使用
bwlabel
,因为它是一种快速功能,并且经过良好测试。您还必须修改代码,使其不在8像素连接中搜索,并且只在4像素连接中搜索。在使用代码之前,请确保还反向输入。

谢谢您的回答!然而,我的问题是用值0而不是1来标记连接的组件。因此,在本例中,4个区域应该有4个标签。我想我可以通过递归的方式解决这个问题,但我不确定它看起来是什么样子。你有什么想法吗?那就在图像的反面执行同样的程序。因此,使用
~L
调用函数。您还需要指定4像素连接。这样,0的值将成为感兴趣的像素,而1的值将分离这些非零像素。这就是你要找的吗?如果是这样的话,我很乐意编辑我的答案。事实上,从你说的有4个地区来看,我相信这是你的正确答案。@user3919259我根据你的评论编辑了我的文章。我相信这就是你想要的。祝你好运