Слияние соседних подключенных компонентов с разными метками - PullRequest
0 голосов
/ 28 декабря 2018

Рассмотрим следующее изображение:

enter image description here

Слева, скажем, у меня есть 3 метки.Фон = 1, черный = 2, оранжевый = 3. То, что я хочу сделать, - это уметь сначала идентифицировать все подключенные компоненты, которые оранжевого цвета, затем, если черные объекты касаются оранжевого, то я хотел бы преобразоватьэто к оранжевому также.

Я знаю следующие шаги:

  1. Предположим, помеченное изображение называется labeled.Я делаю orange = labeled == 3
  2. CC = bwconncomp(orange);

Но отсюда Я не уверен, как я могу проверить, касаются ли какие-либо черные компоненты оранжевого .Как только я узнаю, какие черные компоненты касаются оранжевого, я могу сделать следующее: RP = regionprops(black, 'PixelIdxList'); labeled(RP(index).PixelIdxList) = 3;

Для проверки кода: вот пример генерации ввода и вывода:

%input matrix
I = zeros([8 8]);
I(1:5, 1:5) = 1;
I(2:4, 3:7) = 2;
I(7:8, 1:2) = 1;
I(7:8, 7:8) = 2;
I

%output
O = zeros([8 8]);
O(1:5, 1:5) = 1;
O(2:4, 3:7) = 1;
O(7:8, 1:2) = 1;
O(7:8, 7:8) = 2;
O

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Это можно легко решить, используя imreconstruct.Эта функция для двоичных (логических) входов выполняет заливку.Идея состоит в том, чтобы найти изображение маски (оранжевая и черная области вместе) и изображение маркера (или семени) (оранжевые области).

В качестве демонстрации давайте начнем с того, что уже имеет OP:

orig = readim('https://i.stack.imgur.com/rH7yT.png');
labeled = uint8(round((255-orig{2}(0:866,:))/127));
orange = labeled==1;  % for OP this is 3
black = labeled==2;   % for OP this is 2 also

(Обратите внимание, что labeled не совпадает с тем, который имеет OP, номера для каждой метки разные.)

Теперь мы можем применить imreconstruct:

black_or_orange = orange | black;
output = imreconstruct(orange,black_or_orange);

output теперь содержит оранжевые области, выращенные так, чтобы охватить любые касающиеся черные области.Мы можем создать новое изображение с меткой следующим образом:

new_labeled = uint8(output) + 2*uint8(black & ~output);

figure generated by the code above

0 голосов
/ 28 декабря 2018

Вы можете сделать это следующим образом.Пусть target обозначает целевое значение, соответствующее оранжевому значению.

  1. Идентифицирует области, определенные как связанные компоненты, без учета цвета, используя bwlabel.
  2. Для каждого региона, если он содержит хотя бы пиксель, равный target, задайте для всего региона значение target.
target = 1; % value corresponding to orange
O = I;
[regions, numRegions] = bwlabel(I);
for regionId = 1:numRegions
    ind = regions==regionId;
    if any(I(ind)==target)
        O(ind) = target;
    end
end
...