Управляемая маркером сегментация водораздела

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

Сегментация с помощью водораздела преобразовывает, работает лучше, если можно идентифицировать, или "метка", основные объекты и фоновые местоположения. Управляемая маркером сегментация водораздела выполняет эту основную процедуру:

  1. Вычислите функцию сегментации. Это - изображение, темные области которого являются объектами, которые вы пытаетесь сегментировать.

  2. Вычислите приоритетные маркеры. Это соединенные блобы пикселей в каждом из объектов.

  3. Вычислите фоновые маркеры. Это пиксели, которые не являются частью никакого объекта.

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

  5. Вычислите преобразование водораздела модифицированной функции сегментации.

Шаг 1: Читайте в Цветном изображении и Преобразуйте его в Шкалу полутонов

rgb = imread('pears.png');
I = rgb2gray(rgb);
imshow(I)

text(732,501,'Image courtesy of Corel(R)',...
     'FontSize',7,'HorizontalAlignment','right')

Figure contains an axes object. The axes object contains 2 objects of type image, text.

Шаг 2: используйте величину градиента в качестве функции сегментации

Вычислите величину градиента. Градиент высок на границах объектов и низко (в основном) в объектах.

gmag = imgradient(I);
imshow(gmag,[])
title('Gradient Magnitude')

Figure contains an axes object. The axes object with title Gradient Magnitude contains an object of type image.

Действительно ли можно ли сегментироваться, изображение при помощи водораздела преобразовывают непосредственно на величине градиента?

L = watershed(gmag);
Lrgb = label2rgb(L);
imshow(Lrgb)
title('Watershed Transform of Gradient Magnitude')

Figure contains an axes object. The axes object with title Watershed Transform of Gradient Magnitude contains an object of type image.

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

Шаг 3: отметьте основные объекты

Множество процедур могло быть применено здесь, чтобы найти приоритетные маркеры, которые должны быть связанными блобами пикселей в каждом из основных объектов. В этом примере вы будете использовать названное "открытие реконструкцией" морфологических методов и "закрытие реконструкцией", чтобы "убрать" изображение. Эти операции создадут плоские максимумы в каждом объекте, который может быть расположен с помощью imregionalmax.

Открытие является эрозией, сопровождаемой расширением, в то время как открытие реконструкцией является эрозией, сопровождаемой морфологической реконструкцией. Давайте сравним два. Во-первых, вычислите открытие с помощью imopen.

se = strel('disk',20);
Io = imopen(I,se);
imshow(Io)
title('Opening')

Figure contains an axes object. The axes object with title Opening contains an object of type image.

Затем вычислите открытие реконструкцией с помощью imerode и imreconstruct.

Ie = imerode(I,se);
Iobr = imreconstruct(Ie,I);
imshow(Iobr)
title('Opening-by-Reconstruction')

Figure contains an axes object. The axes object with title Opening-by-Reconstruction contains an object of type image.

После открытия с закрытием может удалить темные пятна и остановить метки. Сравните регулярное морфологическое соглашение с закрытием реконструкцией. Сначала попробуйте imclose:

Ioc = imclose(Io,se);
imshow(Ioc)
title('Opening-Closing')

Figure contains an axes object. The axes object with title Opening-Closing contains an object of type image.

Теперь используйте imdilate сопровождаемый imreconstruct. Заметьте, что необходимо дополнить входные параметры изображений и выход imreconstruct.

Iobrd = imdilate(Iobr,se);
Iobrcbr = imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
imshow(Iobrcbr)
title('Opening-Closing by Reconstruction')

Figure contains an axes object. The axes object with title Opening-Closing by Reconstruction contains an object of type image.

Когда вы видите путем сравнения Iobrcbr с Ioc, основанное на реконструкции открытие и закрытие являются более эффективными, чем стандартное открытие и закрытие при удалении маленьких пятен, не влияя на полные формы объектов. Вычислите региональные максимумы Iobrcbr получить хорошие приоритетные маркеры.

fgm = imregionalmax(Iobrcbr);
imshow(fgm)
title('Regional Maxima of Opening-Closing by Reconstruction')

Figure contains an axes object. The axes object with title Regional Maxima of Opening-Closing by Reconstruction contains an object of type image.

Чтобы помочь интерпретировать результат, наложите приоритетное изображение маркера на оригинальное изображение.

I2 = labeloverlay(I,fgm);
imshow(I2)
title('Regional Maxima Superimposed on Original Image')

Figure contains an axes object. The axes object with title Regional Maxima Superimposed on Original Image contains an object of type image.

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

se2 = strel(ones(5,5));
fgm2 = imclose(fgm,se2);
fgm3 = imerode(fgm2,se2);

Эта процедура имеет тенденцию оставлять некоторые случайные изолированные пиксели, которые должны быть удалены. Можно сделать это использование bwareaopen, который удаляет все блобы, которые имеют меньше, чем определенное число пикселей.

fgm4 = bwareaopen(fgm3,20);
I3 = labeloverlay(I,fgm4);
imshow(I3)
title('Modified Regional Maxima Superimposed on Original Image')

Figure contains an axes object. The axes object with title Modified Regional Maxima Superimposed on Original Image contains an object of type image.

Шаг 4: вычислите фоновые маркеры

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

bw = imbinarize(Iobrcbr);
imshow(bw)
title('Thresholded Opening-Closing by Reconstruction')

Figure contains an axes object. The axes object with title Thresholded Opening-Closing by Reconstruction contains an object of type image.

Фоновые пиксели находятся в черном цвете, но идеально мы не хотим, чтобы фоновые маркеры были слишком близки к ребрам объектов, которые мы пытаемся сегментировать. Мы "разбавим" фон путем вычисления "скелета зонами влияния" или SKIZ, переднего плана bw. Это может быть сделано путем вычисления преобразования водораздела преобразования расстояния bw, и затем ища линии гребня водораздела (DL == 0) из результата.

D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm)
title('Watershed Ridge Lines')

Figure contains an axes object. The axes object with title Watershed Ridge Lines contains an object of type image.

Шаг 5: вычислите преобразование водораздела функции сегментации.

Функциональный imimposemin может использоваться, чтобы изменить изображение так, чтобы оно имело региональные минимумы только в определенных желаемых местоположениях. Здесь можно использовать imimposemin изменить изображение величины градиента так, чтобы его единственные региональные минимумы произошли в переднем плане и фоновых пикселях маркера.

gmag2 = imimposemin(gmag, bgm | fgm4);

Наконец, вычислите основанную на водоразделе сегментацию.

L = watershed(gmag2);

Шаг 6: визуализируйте результат

Один метод визуализации должен наложить приоритетные маркеры, фоновые маркеры и сегментированные границы объекта на оригинальном изображении. Можно использовать расширение по мере необходимости, чтобы сделать определенные аспекты, такие как границы объекта, более видимые. Границы объекта расположены где L == 0. Бинарный передний план и фоновые маркеры масштабируются к различным целочисленным значениям так, чтобы они были присвоены различные метки.

labels = imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;
I4 = labeloverlay(I,labels);
imshow(I4)
title('Markers and Object Boundaries Superimposed on Original Image')

Figure contains an axes object. The axes object with title Markers and Object Boundaries Superimposed on Original Image contains an object of type image.

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

Другой полезный метод визуализации должен отобразить матрицу метки как цветное изображение. Пометьте матрицы, такие как произведенные watershed и bwlabel, может быть преобразован в изображения истинного цвета в целях визуализации при помощи label2rgb.

Lrgb = label2rgb(L,'jet','w','shuffle');
imshow(Lrgb)
title('Colored Watershed Label Matrix')

Figure contains an axes object. The axes object with title Colored Watershed Label Matrix contains an object of type image.

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

figure
imshow(I)
hold on
himage = imshow(Lrgb);
himage.AlphaData = 0.3;
title('Colored Labels Superimposed Transparently on Original Image')

Figure contains an axes object. The axes object with title Colored Labels Superimposed Transparently on Original Image contains 2 objects of type image.

Смотрите также

| | | | | | | | | | | |