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