activecontour

Сегментируйте изображение в передний план и фон с помощью метода роста области активных контуров (змей)

Описание

Метод active contours, также названный snakes, является итеративным алгоритмом сегментации изображений с растущей областью. Используя активный алгоритм контура, вы задаете начальные кривые на изображении, а затем используете activecontour функция для эволюции кривых к контурам объекта.

пример

BW = activecontour(A,mask) сегментирует изображение A в области переднего плана (объект) и области фона с помощью активных контуров.

The mask аргумент является бинарным изображением, которое задает начальное состояние активного контура. Контуры областей объекта (белый) в mask задайте начальное положение контура, используемое для эволюции контура, для сегментации изображения. Выходное изображение BW является бинарным изображением, где передний план является белым (логический true), а фон - черным (логический false).

Чтобы получить более быстрые и точные результаты сегментации, задайте начальное положение контура, которое близко к требуемым контурам объекта.

BW = activecontour(A,mask,n) сегментирует изображение путем развития контура максимум на n итераций.

пример

BW = activecontour(A,mask,method) задает метод активного контура, используемый для сегментации, как 'Chan-Vese' или 'edge'. Для изображений RGB метод должен быть 'Chan-Vese'.

BW = activecontour(A,mask,n,method) сегментирует изображение путем развития контура максимум на n итерации с использованием заданной method.

BW = activecontour(___,Name,Value) задает аргументы пары "имя-значение", которые управляют различными аспектами сегментации.

Примеры

свернуть все

Чтение и отображение полутонового изображения.

I = imread('coins.png');
imshow(I)
title('Original Image')

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

Задайте начальный контур, окружающий интересующие объекты. Отобразите контур.

mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
imshow(mask)
title('Initial Contour Location')

Figure contains an axes. The axes with title Initial Contour Location contains an object of type image.

Сегментируйте изображение с помощью activecontour функция. По умолчанию функция развивает сегментацию до 100 итераций.

bw = activecontour(I,mask);

Отобразите результат. После 100 итераций объекты не полностью сегментируются от фона, поскольку исходный контур не близок к контурам объекта.

imshow(bw)
title('Segmented Image, 100 Iterations')

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

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

bw = activecontour(I,mask,300);
imshow(bw)
title('Segmented Image, 300 Iterations')

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

Чтение и отображение полутонового изображения.

I = imread('toyobjects.png');
imshow(I)

Нарисуйте начальный контур близко к интересующему объекту при помощи drawrectangle функция. После рисования контура создайте маску с помощью createMask функция.

r = drawrectangle;

mask = createMask(r);

Сегментируйте изображение с помощью 'edge' метод и 200 итераций.

bw = activecontour(I,mask,200,'edge');

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

hold on;
visboundaries(bw,'Color','r'); 

Отображение результатов сегментации по оригинальному изображению. Объект переднего плана имеет синий цвет.

figure
imshow(labeloverlay(I,bw));

Загрузите 3-D объемные данные изображения, удалив синглтонную размерность.

D = load('mri.mat');
A  = squeeze(D.D);

Создайте 2-D маску для начальных начальных точек.

seedLevel = 10;
seed = A(:,:,seedLevel) > 75;
figure
imshow(seed)

Figure contains an axes. The axes contains an object of type image.

Создайте пустую маску 3 -D seed и поместите в нее начальные точки.

mask = zeros(size(A));
mask(:,:,seedLevel) = seed;

Выполните сегментацию с помощью активных контуров, задавая seed.

bw = activecontour(A,mask,300);

Отобразите 3-D сегментированное изображение.

figure;
p = patch(isosurface(double(bw)));
p.FaceColor = 'red';
p.EdgeColor = 'none';
daspect([1 1 27/128]);
camlight; 
lighting phong

Figure contains an axes. The axes contains an object of type patch.

Входные параметры

свернуть все

Изображение в сегментированное, заданное как 2-D числовая матрица или 3-D числовой массив.

Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Начальный контур, с которого начинается эволюция сегментации, заданный как бинарное изображение того же размера, как A. Для 2-D и 3-D полутоновых изображений размер mask должен совпадать с размером изображения A. Для цветных и многоканальных изображений, mask должен быть 2-D логическим массивом, где первые две размерности совпадают с первыми двумя размерностями изображения A.

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

Типы данных: logical

Максимальное количество итераций для выполнения в эволюции сегментации, заданное как положительное целое число. activecontour останавливает эволюцию активного контура, когда он достигает максимального количества итераций. activecontour также останавливает эволюцию, если положение контура в текущей итерации совпадает с положением контура в одной из последних пяти итераций.

Если начальное положение контура (задается как mask) далеко от контуров объекта, задайте большие значения n для достижения желаемых результатов сегментации.

Типы данных: double

Метод активного контура, используемый для сегментации, задается как 'Chan-Vese' или 'edge'. Энергетическая модель, основанная на Чан-Везе, описана в [1]. Модель на основе кромок, подобная геодезическим активным контурам, описана в [2].

Для изображений RGB метод должен быть 'Chan-Vese'.

Типы данных: char | string

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'SmoothFactor',1.5

Степень плавности или регулярности контуров сегментированных областей, заданная как разделенная разделенными запятой парами, состоящая из 'SmoothFactor' и положительное число. Более высокие значения дают более гладкие контуры областей, но могут также сглаживать более мелкие детали. Более низкие значения дают больше неровностей (меньше сглаживания) в контурах области, но позволяют захватывать более мелкие детали. Значение сглаживания по умолчанию 0 для 'Chan-Vese' метод и 1 для 'edge' способ.

Пример: 'SmoothFactor',1.5

Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Тенденция контура расти наружу или сжиматься внутрь, заданная как разделенная разделенными запятой парами, состоящая из 'ContractionBias' и числовой скаляр. Положительные значения смещают контур до усадки внутрь (контракт). Отрицательные значения смещают контур, чтобы вырасти наружу (развернуть). Этот параметр не гарантирует, что контур сжимается или расширяется. Не исключено, что даже при положительном значении для этого параметра контур мог действительно расширяться. Однако, задавая смещение, вы замедляете расширение по сравнению с объективным контуром. Типичные значения для этого параметра находятся между -1 и 1. Смещение сужения по умолчанию 0 для 'Chan-Vese' метод и 0.3 для 'edge' способ.

Пример: 'ContractionBias',0.4

Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Выходные аргументы

свернуть все

Сегментированное изображение, возвращенное как бинарное изображение того же размера, что и входное изображение A. Передний план - белый (логический true), а фон - черный (логический false).

Совет

  • activecontour использует контуры областей в mask как начальное состояние контура, с которого начинается эволюция. Отверстия в маске могут привести к непредсказуемым результатам. Использовать imfill чтобы заполнить все отверстия в областях в mask.

  • Если область касается границ изображения, то activecontour удаляет слой с одним пикселем из области перед дальнейшей обработкой так, чтобы область не касалась границы изображения.

  • Чтобы получить более быстрые и точные результаты, задайте начальное положение контура, которое близко к желаемым контурам объекта, особенно для 'edge' способ.

  • Для 'edge' способ, активный контур естественно смещен в сторону усадки внутрь (свертывания). При отсутствии какого-либо градиента изображения активный контур сжимается самостоятельно. И наоборот, с 'Chan-Vese' способ, в котором контур объективен, контур свободен для усадки или расширения на основе функций изображения.

  • Чтобы достичь точной сегментации с 'edge' метод, задайте начальный контур, который находится вне границ объекта. Активный контур с 'edge' метод смещен, чтобы сжаться, по умолчанию.

  • Если области объектов имеют значительно разную интенсивность в полутоновом цвете, то 'Chan-Vese' метод [1] может не сегментировать все объекты в изображении. Например, если изображение содержит объекты, которые ярче фона, и некоторые из них темнее, 'Chan-Vese' метод обычно сегментирует либо темные, либо только яркие объекты.

Алгоритмы

activecontour использует метод Sparse-Field level-set, подобный методу, описанному в [3], для реализации активной эволюции контура.

Ссылки

[1] Т. Ф. Чан, Л. А. Везе, Активные контуры без ребер. Транзакции IEEE по обработке изображений, том 10, выпуск 2, стр. 266-277, 2001.

[2] В. Касельес, Р. Киммель, Г. Сапиро, Геодезические активные контуры. International Journal of Компьютерное Зрение, том 22, выпуск 1, стр. 61-79, 1997.

[3] Р. Т. Уитакер, подход с набором уровней к 3d реконструкции из данных области значений. International Journal of Компьютерное Зрение, том 29, выпуск 3, стр. 203-231, 1998.

Введенный в R2013a