Solución:
En las respuestas a esta pregunta sobre MATLAB Answers se insinúa que graycomatrix
es una buena forma de solucionar este problema. Sin embargo, esas respuestas están incompletas.
graycomatrix
requiere varios argumentos para hacer lo que necesitamos que haga. Calcula una matriz de co-ocurrencia de valores grises. Esta es una matriz que dice, en la celda (i,j)
, con qué frecuencia un valor gris i
ocurre junto a otro valor de gris j
. La relación “junto a” se puede definir en esta función. Por defecto, graycomatrix
devuelve una matriz de 8×8, donde agrupa todos los valores de gris de la imagen en 8 contenedores y busca cualquier valor de gris en el grupo i
que aparece junto a cualquier valor gris en el grupo j
.
Por lo tanto, debemos mantener cada etiqueta en nuestra imagen de superpíxeles separada en esta matriz de co-ocurrencia (hay N
diferentes etiquetas o valores de gris). También necesitamos especificar la relación “junto a” para que sea [1,0]
o [0,1]
, es decir, dos píxeles uno al lado del otro horizontal o verticalmente. Al especificar dos relaciones “próximas a”, obtenemos dos matrices de co-ocurrencia, en forma de una matriz 3D. Tenga en cuenta también que la matriz de co-ocurrencia no es simétrica, en nuestra imagen de superpíxeles, etiqueta i
podría suceder a la izquierda de la etiqueta j
, pero en ese caso es poco probable que j
también pasa a la izquierda de i
. Por lo tanto, glcms(i,j)
tendría un recuento distinto de cero, pero glcms(j,i)
sería cero. En el siguiente código superamos esto haciendo explícitamente simétrica la matriz.
Este es el código:
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
es ahora la matriz de adyacencia. El valor en glcms(i,j)
es distinto de cero si superpíxeles i
y j
son vecinos. El valor indica qué tan grande es el límite entre los dos superpíxeles.
Para calcular una lista de adyacencia:
[I,J] = find(glcms); % returns coordinates of non-zero elements
neighbors = [J,I]
aquí utilizo peppers.png como imagen de ejemplo. Los píxeles del superpíxel vecino se muestran en maskNeighb
variable. El único problema fue ajustar los parámetros de graycomatrix. Quizás necesite diferentes parámetros para su imagen, pero esto debería ayudarlo a comenzar. En la trama, el superpíxel elegido debe aparecer en negro y los vecinos en blanco.
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)