Этот пример показывает, как использовать сегментацию водораздела, чтобы разделить касающиеся объекты в изображении. Водораздел преобразовывает, часто применяется к этой проблеме. Водораздел преобразовывает, находит "бассейны с дренажем" и "строки гребня водораздела" в изображении путем обработки его как поверхности, где светлые пиксели высоки, и темные пиксели являются низкими.
Сегментация с помощью водораздела преобразовывает, работает лучше, если можно идентифицировать, или "метка", основные объекты и фоновые местоположения. Управляемая маркером сегментация водораздела выполняет эту основную процедуру:
1. Вычислите функцию сегментации. Это - изображение, темные области которого являются объектами, которые вы пытаетесь сегментировать.
2. Вычислите приоритетные маркеры. Это соединенные блобы пикселей в каждом из объектов.
3. Вычислите фоновые маркеры. Это пиксели, которые не являются частью никакого объекта.
4. Измените функцию сегментации так, чтобы она только имела минимумы в переднем плане и фоновых местоположениях маркера.
5. Вычислите преобразование водораздела измененной функции сегментации.
Этот пример подсвечивает много различных функций Image Processing Toolbox™, включая imgradient
, watershed
, label2rgb
, labeloverlay
, imopen
, imclose
, imreconstruct
, imcomplement
, imregionalmax
, bwareaopen
, graythresh
и imimposemin
.
rgb = imread('pears.png'); I = rgb2gray(rgb); imshow(I) text(732,501,'Image courtesy of Corel(R)',... 'FontSize',7,'HorizontalAlignment','right')
Вычислите величину градиента. Градиент высок на границах объектов и низко (в основном) в объектах.
gmag = imgradient(I);
imshow(gmag,[])
title('Gradient Magnitude')
Действительно ли можно ли сегментироваться, изображение при помощи водораздела преобразовывают непосредственно на величине градиента?
L = watershed(gmag);
Lrgb = label2rgb(L);
imshow(Lrgb)
title('Watershed Transform of Gradient Magnitude')
Нет. Без дополнительной предварительной обработки, такой как вычисления маркера ниже, с помощью водораздела преобразовывают непосредственно часто результаты в "сверхсегментацию".
Множество процедур могло быть применено здесь, чтобы найти приоритетные маркеры, которые должны быть связанными блобами пикселей в каждом из основных объектов. В этом примере вы будете использовать названное "открытие реконструкцией" морфологических методов и "закрытие реконструкцией", чтобы "убрать" изображение. Эти операции создадут плоские максимумы в каждом объекте, который может быть расположен с помощью 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')
Теперь необходимо отметить фон. В очищенном изображении, 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)')
Функциональный imimposemin
может использоваться, чтобы изменить изображение так, чтобы он имел региональные минимумы только в определенных желаемых местоположениях. Здесь можно использовать imimposemin
, чтобы изменить изображение величины градиента так, чтобы его единственные региональные минимумы произошли в переднем плане и фоновых пикселях маркера.
gmag2 = imimposemin(gmag, bgm | fgm4);
Наконец мы готовы вычислить основанную на водоразделе сегментацию.
L = watershed(gmag2);
Один метод визуализации должен наложить приоритетные маркеры, фоновые маркеры и сегментированные границы объекта на оригинальном изображении. Можно использовать расширение по мере необходимости, чтобы сделать определенные аспекты, такие как границы объекта, более видимые. Границы объекта расположены где 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')
bwareaopen
| bwdist
| imclose
| imcomplement
| imdilate
| imerode
| imgradient
| imopen
| imreconstruct
| imregionalmax
| label2rgb
| labeloverlay
| watershed