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

Для вычисления значения градиента используется оператор Собеля, функция imfilter и другие вычисления. Градиент имеет большие значения на границах объектов и небольшие (в большинстве случаев) вне границ объектов.

hy=fspecial('sobel');hx=hy';Iy=imfilter(double(I), hy, 'replicate');Ix=imfilter(double(I), hx, 'replicate');gradmag=sqrt(Ix.^2+Iy.^2);figure, imshow(gradmag,[]), title('значение градиента')

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

L=watershed(gradmag);Lrgb=label2rgb(L);figure, imshow(Lrgb), title('Lrgb')

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

Шаг 3: Маркировка объектов переднего плана.

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

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

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

Далее вычислим раскрытие с использованием функций imerode и imreconstruct.

Ie=imerode(I, se);Iobr=imreconstruct(Ie, I);figure, imshow(Iobr), title('Iobr')

Последующие морфологические операции раскрытия и закрытия приведут к перемещению темных пятен и формированию маркеров. Проанализируем операции морфологического закрытия. Для этого сначала используем функцию imclose:

Ioc=imclose(Io, se);figure, imshow(Ioc), title('Ioc')

Далее используем функцию imdilate, которая применяется вместе с функцией imreconstruct. Отметим, что для реализации операции imreconstruct необходимо провести операцию дополнения изображений.

Iobrd=imdilate(Iobr, se);Iobrcbr=imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));Iobrcbr=imcomplement(Iobrcbr);figure, imshow(Iobrcbr), title('Iobrcbr')

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

fgm=imregionalmax(Iobrcbr); figure, imshow(fgm), title('fgm')

Наложим маркеры переднего плана на исходное изображение.

I2=I; I2(fgm)=255; figure, imshow(I2), title('fgm, наложенное на исходное изображение')

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

se2=strel(ones(5, 5)); fgm2=imclose(fgm, se2); fgm3=imerode(fgm2, se2);

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

fgm4=bwareaopen(fgm3, 20); I3=I; I3(fgm4)=255; figure, imshow(I3) title('fgm4, наложенное на исходное изображение')