在MATLAB Answers 上对这个问题的回答中暗示这graycomatrix
是解决这个问题的好方法。然而,这些答案是不完整的。
graycomatrix
需要几个参数来做我们需要它做的事情。它计算一个灰度值共生矩阵。这是一个矩阵,表示在单元格中(i,j)
,一个灰度值i
出现在另一个灰度值旁边的频率j
。“next to”关系可以在这个函数中定义。默认情况下,graycomatrix
返回一个 8x8 矩阵,它将图像中的所有灰度值分箱到 8 个分箱中,并在 groupi
中的任何灰度值旁边查找出现在 group 中的任何灰度值j
。
所以我们需要在这个共现矩阵中保持我们超像素图像中的每个标签分开(有N
不同的标签,或灰度值)。我们还需要将“next to”关系指定为[1,0]
or [0,1]
,即水平或垂直相邻的两个像素。当指定两个“next to”关系时,我们得到两个共现矩阵,以 3D 矩阵的形式。还要注意,共现矩阵不是对称的,在我们的超像素图像中,标签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
现在是邻接矩阵。如果超像素和是邻居,则at 的值glcms(i,j)
非零。该值表示两个超像素之间的边界有多大。i
j
计算邻接表:
[I,J] = find(glcms); % returns coordinates of non-zero elements
neighbors = [J,I]