图像中超像素的相邻和非相邻超像素

dtr*_*r43 7 matlab image-processing image-segmentation matlab-coder superpixels

将图像分割成N个超像素后,我需要指定与一个超像素相邻或不相邻的超像素,并为所有超像素确定这种关系。

[L,NumLabels] = superpixels(A,200);
Run Code Online (Sandbox Code Playgroud)

如何为每个超像素指定相邻的超像素?

更新资料

我已经尝试了@Cris Luengo介绍的解决方案。但是出现了以下错误:

B=imread('H.jpg');
[L,N] = superpixels(B,200);
glcms=graycomatrix(L);
k=glcms(:,50);    %SupNum=50
[r,~]=find(k>0); 
aa=find(r==50);
r(aa)=[];
Run Code Online (Sandbox Code Playgroud)

错误

更新2 我按照MATLAB帮助中的说明进行操作,但对我不起作用。对于SupNum = 8,产生了以下结果:

输出量

Cri*_*ngo 6

MATLAB Answers上对该问题的回答中,暗示这graycomatrix是解决此问题的好方法。但是,这些答案是不完整的。

graycomatrix需要几个参数来做我们需要做的事情。它计算灰度共生矩阵。这是一个矩阵,表示在单元格中(i,j),灰度值i在另一个灰度值旁边出现的频率j。可以在此函数中定义“相邻”关系。默认情况下,graycomatrix返回一个8x8矩阵,在该矩阵中将图像中的所有灰度值合并为8个bin,并查找组中任何灰度值i旁边出现的组中任何灰度值j

因此,我们需要在此共生矩阵中将超像素图像中的每个标签都分开放置(存在N不同的标签或灰度值)。我们还需要将“ next to”关系指定为[1,0][0,1],即水平或垂直彼此相邻的两个像素。当指定两个“相邻”关系时,我们以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"
Run Code Online (Sandbox Code Playgroud)

glcms现在是邻接矩阵。glcms(i,j)如果ij是相邻像素,则at的值不为零。该值指示两个超像素之间的边界有多大。

要计算邻接表:

[I,J] = find(glcms);     % returns coordinates of non-zero elements
neighbors = [J,I]
Run Code Online (Sandbox Code Playgroud)