这里我使用peppers.png作为示例图像。相邻超像素中的像素描绘于 maskNeighb 变量。唯一的问题是调整graycomatrix的参数。也许您的图像需要不同的参数,但这应该可以帮助您入门。在图中,选择的超像素应该显示为黑色,并且邻居为白色。
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)
在回答 关于MATLAB答案的这个问题 它被暗示了 graycomatrix 是解决这个问题的好方法。但是,这些答案是不完整的。
graycomatrix
graycomatrix 需要几个参数才能完成我们需要它做的事情。它计算灰度值共生矩阵。这是一个在单元格中表示的矩阵 (i,j) ,灰度值多少次 i 发生在另一个灰度值旁边 j 。可以在此函数中定义“next to”关系。默认情况下, graycomatrix 返回一个8x8矩阵,它将图像中的所有灰度值分成8个区间,并查找组中的任何灰度值 i 发生在组中的任何灰度值旁边 j 。
(i,j)
i
j
所以我们需要在这个共生矩阵中将我们的超像素图像中的每个标签分开(有 N 不同的标签,或灰色值)。我们还需要指定“旁边”关系 [1,0] 要么 [0,1] 即,水平或垂直彼此相邻的两个像素。当指定两个“旁边”关系时,我们以3D矩阵的形式返回两个共现矩阵。还要注意,在我们的超像素图像标签中,共生矩阵不是对称的 i 可能发生在标签的左侧 j ,但在那种情况下,它不太可能 j 也发生在左边 i 。因此, glcms(i,j) 会有一个非零数,但是 glcms(j,i) 将是零。在下面的代码中,我们通过明确地使矩阵对称来克服这个问题。
N
[1,0]
[0,1]
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 是邻居。该值表示两个超像素之间的边界有多大。
glcms
要计算邻接列表:
[I,J] = find(glcms); % returns coordinates of non-zero elements neighbors = [J,I]