Смежные и несмежные суперпиксели для суперпикселя в изображении - PullRequest
0 голосов
/ 02 марта 2019

После сегментирования изображения на N суперпикселей мне нужно указать суперпиксели, которые являются соседними или несмежными с одним суперпикселем, и определить это соотношение для всех суперпикселей.

[L,NumLabels] = superpixels(A,200);

Как указать соседниесуперпиксели для каждого из суперпикселей?

Обновление

Я пробовал решение, представленное @Cris Luengo.Однако возникли следующие ошибки:

B=imread('H.jpg');
[L,N] = superpixels(B,200);
glcms=graycomatrix(L);
k=glcms(:,50);    %SupNum=50
[r,~]=find(k>0); 
aa=find(r==50);
r(aa)=[];

Error

Обновление 2 Я следовал инструкциям в справке MATLAB, но это не такработать на меня.Для SupNum = 8 получен следующий результат:

Output

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

здесь я использую peppers.png в качестве примера изображения.Пиксели в соседнем суперпикселе отображаются в переменной maskNeighb.Единственная проблема заключалась в настройке параметров для серой матрицы.Возможно, вам понадобятся другие параметры для вашего изображения, но это должно помочь вам начать.На графике выбранный суперпиксель должен выглядеть черным, а соседи - белым.

B = imread('peppers.png');
% make superpixels
[L,N] = superpixels(B,200);
% find neighbors for all superpixels
glcms = graycomatrix(L,'NumLevels',N,'GrayLimits',[],'Symmetric',true);
% find superpixels k neighboring superpixel number 50
supNum = 50;
k=find(glcms(:,supNum));  
k(k == supNum) = [];
% find pixels that are in superpixel 50
maskPix = L == supNum;
% find pixels that are in neighbor superpixels k
maskNeighb = ismember(L,k);
% plot
maskPix3 = repmat(maskPix,1,1,3);
maskNeighb3 = repmat(maskNeighb,1,1,3);
Bneigbors = B;
Bneigbors(maskPix3) = 0;
Bneigbors(maskNeighb3) = 255;
figure;
imshow(Bneigbors)
0 голосов
/ 10 марта 2019

В ответах на этот вопрос на MATLAB Ответы намекнули, что graycomatrix - хороший способ решить эту проблему.Однако эти ответы неполны.

graycomatrix требует нескольких аргументов, чтобы сделать то, что нам нужно.Он вычисляет матрицу совместного использования значений серого.Это матрица, которая сообщает в ячейке (i,j), как часто значение серого i появляется рядом с другим значением серого j.Отношение «рядом» может быть определено в этой функции.По умолчанию graycomatrix возвращает матрицу 8x8, где он объединяет все значения серого на изображении в 8 элементов и ищет любое значение серого в группе i, которое встречается рядом с любым значением серого в группе j.

Таким образом, мы должны хранить каждую метку в нашем суперпиксельном изображении отдельно в этой матрице совместного использования (есть N разных меток или значений серого).Нам также необходимо указать отношение «рядом с», равное [1,0] или [0,1], то есть два пикселя рядом друг с другом по горизонтали или вертикали.Определяя два отношения «рядом с», мы получаем обратно две матрицы вхождения в виде трехмерной матрицы.Также обратите внимание, что матрица совместного вхождения не является симметричной, в нашем суперпиксельном изображении метка i может находиться слева от метки j, но в этом случае маловероятно, что j также происходит слева от i.Следовательно, glcms(i,j) будет иметь ненулевой счет, а glcms(j,i) будет равен нулю.В приведенном ниже коде мы преодолеваем это, явно делая матрицу симметричной.

Это код:

B = imread('kobi.png'); % using one of MATLAB's standard images
[L,N] = superpixels(B,200);
glcms = graycomatrix(L,'NumLevels',N,'GrayLimits',[1,N],'Offset',[0,1;1,0]);
glcms = sum(glcms,3);    % add together the two matrices
glcms = glcms + glcms.'; % add upper and lower triangles together, make it symmetric
glcms(1:N+1:end) = 0;    % set the diagonal to zero, we don't want to see "1 is neighbor of 1"

glcms теперь является матрицей смежности.Значение в glcms(i,j) ненулевое, если суперпиксели i и j являются соседями.Значение указывает, насколько велика граница между двумя суперпикселями.

Чтобы вычислить список смежности:

[I,J] = find(glcms);     % returns coordinates of non-zero elements
neighbors = [J,I]
...