在matlab中提取区域



假设现在我有一个图像分割映射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;

最新更新