Смежные и несмежные суперпиксели для суперпикселя в изображении

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

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

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

0 ответов

В ответах на этот вопрос на 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]

Здесь я использую 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)
Другие вопросы по тегам