lazysnapping

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

Описание

пример

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

пример

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

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

Примеры

свернуть все

Чтение и отображение изображения.

RGB = imread('peppers.png');
imshow(RGB)

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

Создайте матрицу меток.

L = superpixels(RGB,500);

Задайте прямоугольный информация только для чтения в переднем плане при помощи drawrectangle функция. Аргумент пара имя-значение 'Position' задает верхние левые координаты, ширину и высоту информация только для чтения в качестве вектора с 4 элементами [xmin,ymin,width,height]. Если вы хотите нарисовать прямоугольник в интерактивном режиме, опустите аргумент пары "имя-значение" 'Position'.

f = drawrectangle(gca,'Position',[100 128 350 150],'Color','g');

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

Создайте маску, содержащую пиксели переднего плана.

foreground = createMask(f,RGB);

Задайте фоновые ROIs. Для повышения точности сегментации в этом примере задаются два прямоугольных ROI в различных областях фона.

b1 = drawrectangle(gca,'Position',[130 30 40 30],'Color','r');
b2 = drawrectangle(gca,'Position',[6 368 500 10],'Color','r');

Figure contains an axes. The axes contains 4 objects of type image, images.roi.rectangle.

Создайте маску, содержащую пиксели фона. Эта маска является объединением двух фоновых ROIs.

background = createMask(b1,RGB) + createMask(b2,RGB);

Выполните ленивые привязки.

BW = lazysnapping(RGB,L,foreground,background);

Визуализируйте результат сегментации, выделив передний план зеленым цветом.

imshow(labeloverlay(RGB,BW,'Colormap',[0 1 0]))

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

Создайте маскированное изображение, в котором фон является черным.

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

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

Чтение и отображение изображения.

RGB = imread('peppers.png');
imshow(RGB)

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

Создайте матрицу меток.

L = superpixels(RGB,500);

Задайте координаты x и y пикселей на переднем плане.

foregroundX = [34 114 195 259 392 467 483];
foregroundY = [298 140 135 200 205 283 104];

Преобразуйте координаты в линейные индексы. sub2ind принимает (строка, столбец) координаты, поэтому задайте входные параметры с y-координатами перед координатами x.

foregroundInd = sub2ind(size(RGB),foregroundY,foregroundX);

Задайте координаты x и y пикселей в фоновом режиме.

backgroundX = [130 170];
backgroundY = [52 32];

Преобразуйте координаты в линейные индексы.

backgroundInd = sub2ind(size(RGB),backgroundY,backgroundX);

Выполните ленивые привязки.

BW = lazysnapping(RGB,L,foregroundInd,backgroundInd);

Отобразите сегментированную маску. Пиксели переднего плана true и фоновые пиксели false.

imshow(BW)

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

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

imshow(labeloverlay(RGB,BW,'Colormap',[0 1 0]))

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

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

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

Создайте маску 2-D, идентифицирующую начальные и начальные точки фона.

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

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

 figure; 
 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;

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

 L = superpixels3(V,500);

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

bw = lazysnapping(V,L,fmask,bmask);

Отобразите 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 полутоновый объем. Для double и single изображения, lazysnapping принимает область значений изображений [0, 1]. Для uint16, int16, и uint8 изображения, lazysnapping принимает, что область значений является полной областью значений для заданного типа данных. Если значения не совпадают с ожидаемой областью значений на основе типа данных, масштабируйте изображение до ожидаемой области значений или корректируйте EdgeWeightScaleFactor улучшить результаты.

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

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

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

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

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

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

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

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

Линейный индекс пикселей в матрице меток, заданный как числовой вектор.

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

Линейный индекс пикселей, которые определяют фон, заданный как числовой вектор.

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

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

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

Пример: 'Connectivity',6

Связность связанных компонентов, заданная как разделенная разделенными запятой парами, состоящая из 'Connectivity' и одно из следующих: 4 или 8, для 2-D изображений, и 6, 18 или 26 для 3-D изображений (томов).

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

Масштабный коэффициент для весов ребер между субрегионами матрицы меток, заданный как разделенная разделенными запятой парами, состоящая из 'EdgeWeightScaleFactor' и положительное число. Типичные значения варьируются от [10, 1000]. Увеличение этого значения увеличивает вероятность того, что lazysnapping подписывает соседние субрегионы вместе как передний план или фон.

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

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

свернуть все

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

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

Совет

  • Ленивый алгоритм привязки, разработанный Li et al. кластеризует значения переднего и заднего плана с помощью метода K-means. Эта реализация ленивого алгоритма привязки не кластеризует аналогичные пиксели переднего или заднего плана. Чтобы улучшить эффективность, уменьшите количество пикселей с аналогичными значениями, которые идентифицируются как передний план или фон.

  • Чтобы получить маски foremask или backmask в интерактивном режиме можно нарисовать информация только для чтения на изображении, а затем создать маску из информация только для чтения при помощи createMask функция. Для получения дополнительной информации см. Обзор создания информация только для чтения.

  • Чтобы получить индексы пикселей foreind или backind в интерактивном режиме можно нарисовать Polyline Информация только для чтения объект при помощи drawpolyline функция. Получите x - и y - координаты вершин из Position свойство Polyline. Наконец, преобразуйте координаты в линейные индексы с помощью sub2ind функция. Обратите внимание, что sub2ind функция использует (row, column) координаты вместо (x, y) координат.

Ссылки

[1] Y. Li, S. Jian, C. Tang, H. Shum, Lazy Snapping In Processions from the 31 International Conference on Computer Graphics and Interactive Technologies, 2004.

Введенный в R2017a