MATLAB: выделение периметров интересующих областей в бинарном изображении: проблемы bwmorph

У меня есть двоичный образ (прикрепленный) с подключенными компонентами, изолированными с помощью bwconncomps. Я пытаюсь определить контур каждого из этих компонентов, но таким образом, чтобы я все еще мог ссылаться на заполненный объект (я использую контур в качестве маски на изображении в оттенках серого, чтобы получить некоторое значение, а затем в зависимости от этого значение, выполняющее операцию над заполненной исходной интересующей областью)

Когда я запускаю bwconncomps на прикрепленном изображении, я получаю идентифицированные 814 объектов. Я могу запустить bwmorph(D,'remove'); и я получаю контуры / периметры объектов, но когда я запускаю bwconncomps для этого, я получаю 827 объектов (не знаю, откуда берутся эти дополнительные объекты, и это портит мою способность ссылаться на заполненный объект на основе значения, которое я вытянуть из его контура).

По сути, мне нужна версия bwmorph(D,'remove'), которая оставит то же количество связанных компонентов, что и в bwconncomps исходного двоичного образа... чтобы я мог сравнить компонент № 30 в исходном двоичном файле с контуром тот же #30 в bwconncomps.

Надеюсь, это было ясно, есть предложения?

Спасибо

введите здесь описание изображения


person user3470496    schedule 14.06.2016    source источник


Ответы (1)


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

%calculate boundries and generate boundry mask
B = bwboundaries(im,'noholes');
boundriesImage = zeros(size(im));
boundriesPixels = cell2mat(B);
boundriesImage(sub2ind(size(im),boundriesPixels(:,1),boundriesPixels(:,2)))=1;

%finds the connected component in the original image and in the boundry
%mask
CC = bwconncomp(im);
CC2 = bwconncomp(boundriesImage);

Результат: CC и CC2 содержат одинаковое количество подключенных компонентов.

CC = 

    Connectivity: 8
       ImageSize: [535 1571]
      NumObjects: 814
    PixelIdxList: {1x814 cell}

CC2 = 

    Connectivity: 8
       ImageSize: [535 1571]
      NumObjects: 814
    PixelIdxList: {1x814 cell}

Кроме того, каждый подключенный компонент CC2{ii} соответствует своему CC{ii}, как видно из следующих результатов теста:

%tests that for each ii, CC{ii} is contained in CC{i}
CC2MatchesToCC1 = true;
for ii=1:length(CC.PixelIdxList)
    if length(intersect(CC2.PixelIdxList{ii},CC.PixelIdxList{ii}))~=length(CC2.PixelIdxList{ii})
        CC2MatchesToCC1 = false;
    end
end

результат:

CC2MatchesToCC1 =

 1
person ibezito    schedule 14.06.2016