假设现在我有一个图像分割映射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的逻辑矩阵,然后用bwlabel
得到所有连接元素。你可以把它们合并在一起。为了避免混合两个区域的问题,只需添加原始矩阵的最大值。例如:
mask = (S == 1);
labeled = bwlabel (mask);
labeled(mask) = labeled(mask) + max (S(:)) - 1;
labeled = S + labeled;
唯一的区别是,以前值为"1"的区域现在都没有这个值,但至少它们被标记为不同的。如果你想让其中一个保持它们的编号,只需要制作另一个最高值的掩码,并使用它将所有掩码返回"1"即可。
labeled(S == max(S(:))) = 1;