Блоки 0 и 1 в двоичном векторе - PullRequest
0 голосов
/ 18 октября 2018

В 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 голосов
/ 18 октября 2018

Вы все еще можете сделать это, используя bwlabel с помощью вертикальной конкатенации x и ~x, используя 4-соединенные компоненты для маркировки,затем максимум вниз по каждому столбцу:

>> max(bwlabel([x; ~x], 4))

ans =

     1     1     2     2     2     3     3     4     4     5     5     5     6

Однако, решение от Bentoy13 , вероятно, немного быстрее.

0 голосов
/ 18 октября 2018
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 четные точки, а затем просто добавить два массива.

0 голосов
/ 18 октября 2018

Все в одной строке:

y = cumsum([1,abs(diff(x))])

А именно, abs(diff(x)) отмечает изменения в двоичном векторе, и вы получаете выход с накопленной суммой.

0 голосов
/ 18 октября 2018

Я нашел эту функцию, которая делает именно то, что я хотел:

https://github.com/davidstutz/matlab-multi-label-connected-components

Итак, клонируйте репозиторий и скомпилируйте в Matlab, используя mex:

mex sp_fast_connected_relabel.cpp

Тогда

labels = sp_fast_connected_relabel(x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...