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