将图像分割成N个超像素后,我需要指定与一个超像素相邻或不相邻的超像素,并确定所有超像素的这种关系。
[L,NumLabels] = superpixels(A,200);
如何为每个超像素指定相邻的超像素?
更新
我尝试了@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)=[];
更新2 我按照MATLAB帮助中的说明进行操作,但对我不起作用。 对于SupNum = 8,产生了以下结果:
答案 0 :(得分:6)
在回答this question on MATLAB Answers时,暗示graycomatrix
是解决此问题的好方法。但是,这些答案是不完整的。
graycomatrix
需要几个参数来完成我们需要做的事情。它计算灰度共生矩阵。这是一个矩阵,表示在单元格(i,j)
中,灰度值i
在另一个灰度值j
旁边出现的频率。可以在此函数中定义“相邻”关系。默认情况下,graycomatrix
返回一个8x8矩阵,它将矩阵中的所有灰度值归为8个bin,并寻找组i
中任何出现在组中任何灰度值旁边的灰度值j
。
因此,我们需要在此共生矩阵中将超像素图像中的每个标签都分开(有N
个不同的标签或灰度值)。我们还需要将“下一个”关系指定为[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"
glcms
现在是邻接矩阵。如果超像素glcms(i,j)
和i
是邻居,则j
的值不为零。该值指示两个超像素之间的边界有多大。
要计算邻接表:
[I,J] = find(glcms); % returns coordinates of non-zero elements
neighbors = [J,I]
答案 1 :(得分:3)
在这里,我以Peppers.png为例。 from django.template.defaultfilters import truncatechars
class Response(models.Model):
...
def __str__(self):
return (str(self.id) + " " + self.author_name + "|" + truncatechars(self.resonse_content, 10))
变量中描述了相邻超像素中的像素。唯一的问题是调整Graycomatrix的参数。也许您需要为图像使用不同的参数,但这应该可以帮助您入门。在该图中,所选的超像素应显示为黑色,而相邻的像素应显示为白色。
maskNeighb