我得到一个图像,也是图像中区域的边界。例如,我有一个具有逻辑类型的遮罩,边界值为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,而对于其他像素,值为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
有了上面的图,将有会被识别四个区域。
从图像处理工具箱功能bwlabel
是应该使用标记的非零像素的每一连续区域中的二元掩模理想的功能。但是,您希望对由“边界”像素设置为1的像素描绘的像素执行此操作。因此,只需使用二进制掩码的反色,以便在零像素上进行操作,而不是非零像素。同样从您的定义中,区域使用4像素连接来分隔。 bwlabel
在搜索连续区域时默认使用8像素连接,这意味着它在N,NE,E,SE,S,SW,W和NW方向上查找。你要手动指定4像素连接,这看起来只是假设你的面具被存储在变量L
的N,E,S和W
的方向,简单地做:
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像素连接。确保在使用代码之前也反转输入。
感谢您的回答!虽然,我的问题是标记连接的组件的值为0,而不是1.因此,在这个例子中,应该有4个区域的标签。我想我可以通过递归来解决这个问题,但不知道它是怎么样的。你有什么主意吗? – user3919259
然后只对图像的反方向执行相同的过程。所以用'〜L'调用函数。您还需要指定4个像素连接。这样,值为0的值就成为感兴趣的像素,而值为1的值将分开那些非零像素。这是你在找什么?如果是这种情况,我很乐意编辑我的答案。事实上,我认为这是你判断你有4个地区的正确答案。 – rayryeng
@ user3919259我根据您的意见编辑了我的帖子。我相信这是你想要的。祝你好运。 – rayryeng