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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于图像中的超像素的相邻和非相邻超像素相关的知识,希望对你有一定的参考价值。

在将图像分割成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)=[];

Error

更新2我遵循MATLAB帮助中的说明,但它对我不起作用。对于SupNum = 8,产生了以下结果:

Output

答案

在回答this question on MATLAB Answers时,暗示graycomatrix是解决这个问题的好方法。但是,这些答案是不完整的。

graycomatrix需要几个参数来做我们需要它做的事情。它计算灰度值共生矩阵。这是一个矩阵,在单元格(i,j)中,灰色值i出现在另一个灰度值j旁边的频率。可以在此函数中定义“next to”关系。默认情况下,graycomatrix返回一个8x8矩阵,它将图像中的所有灰度值分成8个区间,并查找组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]
另一答案

这里我使用peppers.png作为示例图像。相邻超像素中的像素以maskNeighb变量描绘。唯一的问题是调整graycomatrix的参数。也许您的图像需要不同的参数,但这应该可以帮助您入门。在图中,选择的超像素应该显示为黑色,并且邻居为白色。

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)

以上是关于用于图像中的超像素的相邻和非相邻超像素的主要内容,如果未能解决你的问题,请参考以下文章

超像素分割算法

最简单的SLIC算法实现

在 Python 中为图像中的每个像素选择 7*7 相邻像素的最快方法

OpenCV4+OpenVINO实现图像的超像素

Tensorflow - 为图像张量中的每个像素查找最大3个相邻像素

OpenCV4+OpenVINO实现图像的超像素