У меня проблема с реализацией управляемого маркером водораздела в Matlab.
Входное изображение - это двоичная маска с двумя кластеризованными объектами.Другое изображение - это другое двоичное изображение, где белые области обозначают маркеры.
Затем я пытаюсь использовать управляемый маркером водораздел для разделения кластерного объекта.Код выглядит следующим образом:
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 ')
Результат показан в виде этого графика.
Он разбивает объект на две части, но форма не остается неизменной.Я хочу получить весь объект, но только линию, разделяющую их (как показано ниже). Кто-нибудь может мне помочь?Благодарю.
Прикрепленный вопрос: Спасибо, что Йода дает ответ.Тем не менее, в этом случае преобразование расстояния с использованием '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);
Локальные минимумы и результат показаны следующим образом:
Обратите внимание, что на левом рисункелокальный минимум отображается в виде белых областей.Замечено, что только два локальных минимума показаны в кластеризованных объектах.Это приводит к хорошим результатам.
Теперь давайте посмотрим на преобразование расстояния с помощью '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')
Локальные минимумы и результат показаны следующим образом:
Обратите внимание, что на левом рисунке локальный минимум показан в виде белых областей.Наблюдается, что в области кластерных объектов показано много локальных минимумов.Таким образом, это приводит к чрезмерно сегментированным результатам.
Пересегментация объясняется тем, что водораздел сначала проверяет локальные минимумы на изображении, а затем базируется на локальных минимумах и выполняет водораздел.Обратите внимание, что если слишком много локальных минимумов, чем желаемые сегментированные объекты, это приведет к чрезмерной сегментации.Предложенный маркером водораздел предлагается заменить первоначальными локальными минимумами и достичь лучшего результата (поскольку каждый маркер будет представлять один желаемый сегментированный объект).Но я не знаю, как наложить «маркер» так, чтобы исходные локальные минимумы были подавлены, а изображение имело только локальные минимумы, указанные «маркером».Спасибо.