exponenta event banner

Обнаружение клеток с помощью обнаружения краев и морфологии

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

Шаг 1: Чтение изображения

Читайте в 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');

Figure contains an axes. The axes with title Original Image contains 3 objects of type image, text.

Шаг 2: Обнаружение всей ячейки

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

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

[~,threshold] = edge(I,'sobel');
fudgeFactor = 0.5;
BWs = edge(I,'sobel',threshold * fudgeFactor);

Отображение полученной маски двоичного градиента.

imshow(BWs)
title('Binary Gradient Mask')

Figure contains an axes. The axes with title Binary Gradient Mask contains an object of type image.

Шаг 3: Расширение изображения

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

se90 = strel('line',3,90);
se0 = strel('line',3,0);

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

BWsdil = imdilate(BWs,[se90 se0]);
imshow(BWsdil)
title('Dilated Gradient Mask')

Figure contains an axes. The axes with title Dilated Gradient Mask contains an object of type image.

Шаг 4: Заполнить внутренние промежутки

Расширенная градиентная маска довольно хорошо показывает контур ячейки, но во внутренней части ячейки все еще имеются отверстия. Для заполнения этих отверстий используйте imfill функция.

BWdfill = imfill(BWsdil,'holes');
imshow(BWdfill)
title('Binary Image with Filled Holes')

Figure contains an axes. The axes with title Binary Image with Filled Holes contains an object of type image.

Шаг 5: Удаление подключенных объектов на границе

Интересующая ячейка была успешно сегментирована, но это не единственный найденный объект. Любые объекты, подключенные к границе изображения, можно удалить с помощью imclearborder функция. Чтобы удалить диагональные соединения, установите соединение в imclearborder функция для 4.

BWnobord = imclearborder(BWdfill,4);
imshow(BWnobord)
title('Cleared Border Image')

Figure contains an axes. The axes with title Cleared Border Image contains an object of type image.

Шаг 6: Сглаживание объекта

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

seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
imshow(BWfinal)
title('Segmented Image');

Figure contains an axes. The axes with title Segmented Image contains an object of type image.

Шаг 7. Визуализация сегментации

Вы можете использовать labeloverlay для отображения маски поверх исходного изображения.

imshow(labeloverlay(I,BWfinal))
title('Mask Over Original Image')

Figure contains an axes. The axes with title Mask Over Original Image contains an object of type image.

Альтернативным способом отображения сегментированного объекта является рисование контура вокруг сегментированной ячейки. Нарисуйте контур с помощью bwperim функция.

BWoutline = bwperim(BWfinal);
Segout = I; 
Segout(BWoutline) = 255; 
imshow(Segout)
title('Outlined Original Image')

Figure contains an axes. The axes with title Outlined Original Image contains an object of type image.

См. также

| | | | | |

Связанные темы