exponenta event banner

Сегментация водосбора под управлением маркера

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

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

  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. The axes contains 2 objects of type image, text.

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

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

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

Figure contains an axes. The axes 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. The axes 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. The axes 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. The axes 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. The axes 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. The axes 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. The axes 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. The axes with title Regional Maxima Superimposed on Original Image contains an object of type 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')

Figure contains an axes. The axes 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. The axes 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. The axes 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. The axes 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. The axes 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. The axes with title Colored Labels Superimposed Transparently on Original Image contains 2 objects of type image.

См. также

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