二进制向量中的数字0和1的块

时间:2018-10-18 13:33:07

标签: arrays matlab

在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]

但是我如何将它们结合起来?

4 个答案:

答案 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,但是第二个索引应该从12,第三个索引应该从23,依此类推;因此,偶数索引应加倍,奇数索引应加倍减一。 A+A-1表示奇数项,B+B表示偶数项。因此,只需简单地检查AB是否包含偶数点,然后简单地将两个数组相加即可。

答案 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);