Чрезмерная сегментация в контролируемом маркером водоразделе в Матлабе - PullRequest
8 голосов
/ 15 сентября 2011

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

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

image marker

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

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' хорошо, но если мы используем 'евклидово', это приведет к чрезмерной сегментации.Поскольку водораздел будет зависеть от локальных минимумов на изображении, и совпадение того, что преобразование расстояния «ситоблоков» приводит к правильному количеству локальных минимумов.Если мы применим «городской блок» для другого изображения, это также приведет к чрезмерной сегментации.Теперь давайте посмотрим на код yoda:

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

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

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

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 ]

8 голосов
/ 15 сентября 2011

Решение 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

3 голосов
/ 15 сентября 2011

Вот как бы я сделал это в 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

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