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

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

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

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

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

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

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

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

Этот пример подсвечивает много различных функций Image Processing Toolbox™, включая imgradient, watershed, label2rgb, labeloverlay, imopen, imclose, imreconstruct, imcomplement, imregionalmax, bwareaopen, graythresh, и imimposemin.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

I2 = labeloverlay(I,fgm);
imshow(I2)
title('Regional Maxima Superimposed on Original 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')

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

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

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

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

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

Шаг 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')

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

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

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

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

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

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

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