在Matlab中提取区域

3
假设现在我有一张图像分割地图S,其索引范围为1到k。相同编号的索引属于同一分段。例如:
S = [1 1 1 2 2 2;
     1 1 1 2 2 2;
     2 2 2 2 1 1;
     2 2 2 2 1 1;
     2 2 2 2 1 1]

对于这个分割地图S,我想要得到区域。例如,S中的“1”有两个孤立的部分,因此我想要得到三个区域--两个带有标签1和一个带有标签2的区域,并且为了区分两个“1”,我想将其中一个更改为另一个标签,比如3。因此,最终的地图是:

S = [1 1 1 2 2 2;
     1 1 1 2 2 2;
     2 2 2 2 3 3;
     2 2 2 2 3 3;
     2 2 2 2 3 3]

我在考虑使用联通组件来解决这个问题,但需要制定亲和矩阵。有更好的方法吗?


1
为什么不使用bwconncomp或bwlabel?它特别适合这个问题。 - Andrey Rubshtein
1
你想获取第二个 S 矩阵吗? - Eitan T
@EitanT 是的。现在问题已经解决了。无论如何还是谢谢! - jrenzhile
1个回答

2

只需获取一个全为1的逻辑矩阵,然后使用bwlabel获取所有连接的元素。您可以将它们合并在一起。为了避免混合两个区域的问题,只需添加原始矩阵的最大值即可。例如:

mask           = (S == 1);
labeled        = bwlabel (mask);
labeled(mask)  = labeled(mask) + max (S(:)) - 1;
labeled         = S + labeled;

唯一的区别是现在没有任何区域的值为“1”,但至少它们被标记不同了。如果您想让其中一个保留其数字,只需创建另一个掩码以获取最高值,并使用它将它们全部转换回“1”。
labeled(S == max(S(:))) = 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接