给定图像中区域的边界进行图像分割
do image segmentation given the boundary of regions in the image
我得到了一张图像以及图像中区域的边界。比如我有一个logical类型的mask,boundary的值为1,而其他pixels的值为0。我想给被boundaries分割的区域打上标签,但是不知道怎么分割和打标签基于连续边界的区域。
边界看起来像这样:
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
根据上图,将识别出四个区域。
图像处理工具箱中的函数 bwlabel
是理想的函数,您应该使用它来标记二进制蒙版中非零像素的每个连续区域。但是,您想在 零 像素上执行此操作,这些像素由设置为 1 的 "boundary" 像素划定。因此,只需使用二进制掩码的倒数即可您正在对零像素而不是非零像素进行操作。同样根据您的定义,区域使用 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
并从第一原理开始,你可以参考我之前的post使用深度优先搜索来查找连接组件的区域:How to find all connected components in a binary image in Matlab?。请注意,这不是高效的代码,因此您应该仅将其用于教育和研究目的。推荐使用 bwlabel
,因为它是一个快速的函数并且经过了良好的测试。您还必须修改代码,使其不在 8 像素连接中搜索,而应该只查看 4 像素连接。确保在使用代码之前也反转了输入。
我得到了一张图像以及图像中区域的边界。比如我有一个logical类型的mask,boundary的值为1,而其他pixels的值为0。我想给被boundaries分割的区域打上标签,但是不知道怎么分割和打标签基于连续边界的区域。
边界看起来像这样:
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
根据上图,将识别出四个区域。
图像处理工具箱中的函数 bwlabel
是理想的函数,您应该使用它来标记二进制蒙版中非零像素的每个连续区域。但是,您想在 零 像素上执行此操作,这些像素由设置为 1 的 "boundary" 像素划定。因此,只需使用二进制掩码的倒数即可您正在对零像素而不是非零像素进行操作。同样根据您的定义,区域使用 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
并从第一原理开始,你可以参考我之前的post使用深度优先搜索来查找连接组件的区域:How to find all connected components in a binary image in Matlab?。请注意,这不是高效的代码,因此您应该仅将其用于教育和研究目的。推荐使用 bwlabel
,因为它是一个快速的函数并且经过了良好的测试。您还必须修改代码,使其不在 8 像素连接中搜索,而应该只查看 4 像素连接。确保在使用代码之前也反转了输入。