В этом примере показано, как использовать сегментацию водосбора для разделения касающихся объектов на изображении. Преобразование водораздела находит "водосборные умывальные раковины и" водоразделный хребет линий "на изображении путем обработки его как поверхности, где светлые пиксели высоки, а темные пиксели низки.
Сегментация с помощью преобразования водосбора работает лучше, если можно идентифицировать или «пометить» объекты переднего плана и местоположения фона. Сегментация водосбора, контролируемая маркером, выполняется в соответствии с этой основной процедурой:
Вычислите функцию сегментации. Это изображение, темные области которого являются объектами, которые вы пытаетесь сегментировать.
Вычислите маркеры переднего плана. Это соединенные пятна пикселей в каждом из объектов.
Вычислите маркеры фона. Это пиксели, которые не являются частью какого-либо объекта.
Измените функцию сегментации так, чтобы она имела минимумы только в расположениях основных и фоновых маркеров.
Вычислите преобразование водораздела измененной функции сегментации.
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
, который удаляет все blobs, которые имеют меньше, чем определенное количество пикселей.
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
, может быть преобразован в изображения truecolor в целях визуализации при помощи 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