Чрезмерная сегментация в контролируемом маркером водоразделе в Matlab

у меня проблема при реализации маркера контролируемого водораздела в Matlab.

входное изображение представляет собой двоичную маску, которая имеет два кластеризованных объекта. Другое изображение-это другое двоичное изображение, где белые области указывают маркеры.

imagemarker

затем я пытаюсь использовать управляемый маркером водораздел для разделения кластеризованного объекта. Код выглядит следующим образом:

bw=imread('Im.jpg'); % read image
bwMarker=imread('Marker.jpg');% read marker
bw(bwMarker)=0; % impose the marker on the image
L=watershed(bw);% do the watershed
%% plot
rgb = label2rgb(L,'jet',[.5 .5 .5]);
figure(2), imshow(rgb,'InitialMagnification','fit')
title('Marker Controlled Watershed transform ')

результат показан как этот сюжет.

enter image description here
Он делит объект на две части, но форма не является неповрежденной. Я хочу получить весь объект, но только линия, разделяющая два (как показано ниже), может ли кто-нибудь помочь мне? Спасибо.

enter image description here

добавлен вопрос: Спасибо, что йода дает ответ. Однако в этом случае преобразование расстояния с использованием "cityblock" хорошо, но если мы используем "евклидово", это приведет к чрезмерной сегментации. Потому что водораздел будет зависеть от местных минимумы в изображении и совпадение, что преобразование расстояния "cityblock" приводит к правильному количеству локальных минимумов. Если мы применим "cityblock" для другого изображения, это также приведет к чрезмерной сегментации. Теперь давайте посмотрим код Йоды:

img=im2bw(imread('http://i.stack.imgur.com/qrYCL.jpg'));

imgDist=-bwdist(~img,'cityblock');
imgDist(~img)=-inf; 

% check local minimums
BW = imregionalmin(imgDist);
figure(1), imshow(BW);  
title('Regional Minima in Original Image');

imgLabel=watershed(imgDist); 

локальные минимумы и результат показаны следующим образом:

enter image description hereenter image description here

обратите внимание, что на левом рисунке локальный минимум отображается как белые области. Отмечается, что только два локальных минимума показано в кластеризованных объектах. Так приводит к хорошим результатам.

Теперь давайте посмотрим на преобразование расстояния с помощью "евклидова".

imgDist=-bwdist(~img);
imgDist(~img)=-inf; 

% check local minimums    
BW = imregionalmin(imgDist);
figure(1), imshow(BW);  
title('Regional Minima in Original Image');

imgLabel=watershed(imgDist);    

imshow(imgLabel==0,'InitialMagnification','fit')

локальные минимумы и результат показаны следующим образом:

enter image description hereenter image description here

обратите внимание, что на левом рисунке локальный минимум отображается как белые области. Отмечается, что в области кластеризованных объектов показано много локального минимума. Так что это приводит к чрезмерной сегментации результаты.

излишек сегментация потому что водораздел сперва проверит вне локальные минимумы в изображении, тогда основание на локальных минимумах, выполняет водораздел. Обратите внимание, что если слишком много локальных минимумов, чем желаемые сегментированные объекты, это приведет к чрезмерной сегментации. Предлагается маркер управляемого водораздела заменить исходные локальные минимумы и добиться лучшего результата (так как каждый маркер будет представлять один желаемый сегментированный объект). Но я не знаю как наложите "маркер" так, чтобы исходные локальные минимумы были нажаты, а изображение имело только локальные минимумы, указанные "маркером". Спасибо.

2 ответов


решение 2: Использование маркера на основе водораздела:

вы можете использовать функцию imimposemin чтобы заставить локальные минимумы быть там, где ваши маркеры. Вам нужно будет слегка изменить код в решении 1 ниже, заменив первый imDist... строку с

imgDist=-bwdist(~img);
imgDist=imimposemin(imgDist,marker);

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

enter image description here


Решение 1: Использование Манхэттенского расстояния:

вот решение в MATLAB, который разделяет ваши два кластера:

img=im2bw(imread('http://i.stack.imgur.com/qrYCL.jpg'));

imgDist=-bwdist(~img,'cityblock');
imgDist(~img)=-inf;    
imgLabel=watershed(imgDist);    

imshow(imgLabel==0,'InitialMagnification','fit')

enter image description here


вот как я бы сделал это в Mathematica. Надеюсь, вы сможете перевести.

i1 = Binarize@Import["http://i.stack.imgur.com/qrYCL.jpg"];
marker = Binarize@Import[  "http://i.stack.imgur.com/CMI6Z.jpg"]; 

ImageMultiply[i1, WatershedComponents[i1, marker] // Colorize]

enter image description here