grabcut

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

Описание

пример

BW = grabcut(A,L,ROI) сегментирует изображение A в области переднего и заднего плана. Матрица меток L задает субрегионы изображения. ROI является логической маской, обозначающей начальную необходимую область.

BW = grabcut(A,L,ROI,foremask,backmask) сегментирует изображение A, где foremask и backmask являются масками, обозначающими пиксели в изображении как передний план и фон, соответственно.

BW = grabcut(A,L,ROI,foreind,backind) сегментирует изображение A, где foreind и backind задайте линейные индексы пикселей на изображении, отмеченном как передний и задний план, соответственно.

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

Примеры

свернуть все

Чтение изображения RGB в рабочую область.

RGB = imread('peppers.png');

Сгенерируйте матрицу меток.

L = superpixels(RGB,500);

Задайте необходимую область и создайте маскировочное изображение.

figure
imshow(RGB)
h1 = drawpolygon(gca,'Position',[72,105; 1,231; 0,366; 104,359;...
        394,307; 518,343; 510,39; 149,72]);

Figure contains an axes. The axes contains 2 objects of type image, images.roi.polygon.

roiPoints = h1.Position;
roi = poly2mask(roiPoints(:,1),roiPoints(:,2),size(L,1),size(L,2));

Выполните операцию grab cut, задав оригинальное изображение, матрицу меток и информации только для чтения.

BW = grabcut(RGB,L,roi);
figure
imshow(BW)

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

Создайте маскированное изображение.

maskedImage = RGB;
maskedImage(repmat(~BW,[1 1 3])) = 0;
figure;
imshow(maskedImage)

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

Загрузка 3-D объемных данных.

load mristack
V = mristack;

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

seedLevel = 10;
fseed = V(:,:,seedLevel) > 75;
bseed = V(:,:,seedLevel) == 0;

Отображение точек seed переднего плана и фона.

imshow(fseed)

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

imshow(bseed)

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

Поместите начальные точки в пустую маску 3-D.

fmask = zeros(size(V));
bmask = fmask;
fmask(:,:,seedLevel) = fseed;
bmask(:,:,seedLevel) = bseed;

Создайте начальную необходимую область.

roi = false(size(V));
roi(10:end-10,10:end-10,:) = true;

Сгенерируйте матрицу меток.

L = superpixels3(V,500);

Выполните команду GrabCut.

bw = grabcut(V,L,roi,fmask,bmask);

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

montage(reshape(bw,size(V)))

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

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

свернуть все

Входное изображение или объем, заданный как 2-D изображение в полутоновом цвете, 2-D изображение в труколоре или 3-D объем в полутоновом цвете. Типом данных могут быть только полутоновые изображения int16.

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

Матрица меток, заданная как числовой массив.

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

Необходимая область, заданная как логический массив. Все пиксели, которые определяют необходимую область, равны true.

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

Маска переднего плана, заданная как логический массив.

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

Маска фона, заданная как логический массив.

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

Индексы пикселей в переднем плане, заданные как вектор линейных индексов.

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

Индексы пикселей в фоновом режиме, заданные как вектор линейных индексов.

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

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

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

Пример: BW = grabcut(A,L,ROI,'Connectivity',4)

Связь подключенных компонентов в виде одного из следующих значений. Связность по умолчанию - 8 для 2-D изображений и 26 для 3-D изображений.

Значение

Значение

Двумерные связи

4

4-связанный район

Текущий пиксель показан серым цветом.

8

8-связанный район

Текущий пиксель показан серым цветом.

Трехмерные связи

6

6-связанный район

Текущий пиксель является центром куба.

18

18-связанный район

Текущий пиксель является центром куба.

26

26-связанный район

Текущий пиксель является центром куба.

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

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

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

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

свернуть все

Сегментированное изображение, возвращенное как бинарное изображение того же размера, что и матрица меток L.

Совет

  • Для double и single изображения, grabcut принимает область значений изображений, который будет [0 1]. Для uint16, int16, и uint8 изображения, grabcut принимает, что область значений является полной областью значений для заданного типа данных.

  • Для полутоновых изображений размер L, foremask, и backmask должен совпадать с размером изображения A. Для цветных и многоканальных изображений, L, foremask, и backmask должны быть 2-D массивы с первыми двумя размерностями, идентичными первым двум размерностям изображения A.

Алгоритмы

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

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

  • Алгоритм предполагает, что все субрегионы за пределами необходимой области принадлежат фону. Пометка одного из этих субрегионов как принадлежащего переднему плану или маске фона не влияет на полученную сегментацию.

Ссылки

[1] Rother, C., В. Колмогоров и А. Блейк. «GrabCut - интерактивное извлечение переднего плана с использованием итерационных Графиков вырезов». Транзакции ACM на графике (SIGGRAPH). Том 23, № 3, 2004, стр. 309-314.

Введенный в R2018a