Для вычисления значения градиента используется оператор Собеля, функция 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, наложенное на исходное изображение')