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