在MATLAB中,有一个bwlabel
函数,给定一个二进制向量,例如x=[1 1 0 0 0 1 1 0 0 1 1 1 0]
给出(bwlabel(x)
):
[1 1 0 0 0 2 2 0 0 3 3 3 0]
但是我想要获得的是
[1 1 2 2 2 3 3 4 4 5 5 5 6]
我知道我可以否定x
以获得(bwlabel(~x)
)
[0 0 1 1 1 0 0 2 2 0 0 0 3]
但是我如何将它们结合起来?
答案 0 :(得分:6)
全部一行:
y = cumsum([1,abs(diff(x))])
也就是说,abs(diff(x))
会发现二进制矢量中的变化,并且您将获得累积总和的输出。
答案 1 :(得分:3)
您仍然可以使用bwlabel
x
和~x
的{{3}},使用vertically concatenating进行标记,然后使用4-connected components在每一列下:
>> max(bwlabel([x; ~x], 4))
ans =
1 1 2 2 2 3 3 4 4 5 5 5 6
但是,maximum可能要快一些。
答案 2 :(得分:1)
x=[1 1 0 0 0 1 1 0 0 1 1 1 0];
A = bwlabel(x);
B = bwlabel(~x);
if x(1)==1
tmp = A>0;
A(tmp) = 2*A(tmp)-1;
tmp = B>0;
B(tmp) = 2*B(tmp);
C = A+B
elseif x(1)==0
tmp = A>0;
A(tmp) = 2*A(tmp);
tmp = B>1;
B(tmp) = 2*B(tmp)-1;
C = A+B
end
C =
1 1 2 2 2 3 3 4 4 5 5 5 6
您知道第一个索引应该保留1
,但是第二个索引应该从1
到2
,第三个索引应该从2
到3
,依此类推;因此,偶数索引应加倍,奇数索引应加倍减一。 A+A-1
表示奇数项,B+B
表示偶数项。因此,只需简单地检查A
或B
是否包含偶数点,然后简单地将两个数组相加即可。
答案 3 :(得分:-1)
我发现此功能完全可以实现我想要的功能:
https://github.com/davidstutz/matlab-multi-label-connected-components
因此,克隆存储库并使用mex
在matlab中进行编译:
mex sp_fast_connected_relabel.cpp
然后
labels = sp_fast_connected_relabel(x);