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

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

Шаг 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);

Расширьте двоичную градиентную маску с помощью вертикального элемента структурирования, за которым следует горизонтальный элемент структурирования. The 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.

См. также

| | | | | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте