В этом примере показано, как обнаружить клетку с помощью обнаружения краев и базовой морфологии. Объект может быть легко обнаружен на изображении, если объект имеет достаточный контраст от фона.
Читайте в cell.tif изображение, которое является изображением клетки рака предстательной железы. На этом изображении присутствуют две клетки, но только одна клетка может быть видна целиком. Целью является обнаружение или сегментация полностью видимой ячейки.
I = imread('cell.tif'); imshow(I) title('Original Image'); text(size(I,2),size(I,1)+15, ... 'Image courtesy of Alan Partin', ... 'FontSize',7,'HorizontalAlignment','right'); text(size(I,2),size(I,1)+25, .... 'Johns Hopkins University', ... 'FontSize',7,'HorizontalAlignment','right');

Сегментируемый объект сильно отличается от фонового изображения. Изменения контраста могут обнаруживаться операторами, которые вычисляют градиент изображения. Чтобы создать двоичную маску, содержащую сегментированную ячейку, вычислите градиентное изображение и примените пороговое значение.
Использовать edge и оператор Собеля для вычисления порогового значения. Настройка порогового значения и использование edge для получения двоичной маски, содержащей сегментированную ячейку.
[~,threshold] = edge(I,'sobel'); fudgeFactor = 0.5; BWs = edge(I,'sobel',threshold * fudgeFactor);
Отображение полученной маски двоичного градиента.
imshow(BWs)
title('Binary Gradient Mask')
Двоичная градиентная маска показывает на изображении линии высокой контрастности. Эти строки не совсем очерчивают очертания интересующего объекта. По сравнению с исходным изображением в линиях, окружающих объект в градиентной маске, имеются промежутки. Эти линейные промежутки исчезнут, если изображение Собеля будет расширено с использованием элементов линейного структурирования. Создание двух вечных линейных элементов структурирования с помощью strel функция.
se90 = strel('line',3,90); se0 = strel('line',3,0);
Расширьте двоичную градиентную маску с помощью вертикального структурного элемента, за которым следует горизонтальный структурный элемент. imdilate функция расширяет изображение.
BWsdil = imdilate(BWs,[se90 se0]);
imshow(BWsdil)
title('Dilated Gradient Mask')
Расширенная градиентная маска довольно хорошо показывает контур ячейки, но во внутренней части ячейки все еще имеются отверстия. Для заполнения этих отверстий используйте imfill функция.
BWdfill = imfill(BWsdil,'holes'); imshow(BWdfill) title('Binary Image with Filled Holes')

Интересующая ячейка была успешно сегментирована, но это не единственный найденный объект. Любые объекты, подключенные к границе изображения, можно удалить с помощью imclearborder функция. Чтобы удалить диагональные соединения, установите соединение в imclearborder функция для 4.
BWnobord = imclearborder(BWdfill,4);
imshow(BWnobord)
title('Cleared Border Image')
Наконец, чтобы сделать сегментированный объект естественным, сглаживайте объект путем размывания изображения дважды с помощью элемента структурирования ромба. Создайте элемент структурирования ромба с помощью strel функция.
seD = strel('diamond',1); BWfinal = imerode(BWnobord,seD); BWfinal = imerode(BWfinal,seD); imshow(BWfinal) title('Segmented Image');

Вы можете использовать labeloverlay для отображения маски поверх исходного изображения.
imshow(labeloverlay(I,BWfinal))
title('Mask Over Original Image')
Альтернативным способом отображения сегментированного объекта является рисование контура вокруг сегментированной ячейки. Нарисуйте контур с помощью bwperim функция.
BWoutline = bwperim(BWfinal);
Segout = I;
Segout(BWoutline) = 255;
imshow(Segout)
title('Outlined Original Image')
bwperim | edge | imclearborder | imdilate | imerode | imfill | strel