图像中超像素的相邻和不相邻超像素
Adjacent and non-adjacent superpixels for an superpixel in an image
将一幅图像分割成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,产生了以下结果:
在回答this question on MATLAB Answers it is hinted that graycomatrix
中是解决这个问题的好方法。但是,这些答案是不完整的。
graycomatrix
需要几个参数来完成我们需要它做的事情。它计算灰度值共生矩阵。这是一个矩阵,表示在单元格 (i,j)
中,灰度值 i
出现在另一个灰度值 j
旁边的频率。 "next to"关系可以在这个函数中定义。默认情况下,graycomatrix
returns 一个 8x8 矩阵,它将图像中的所有灰度值分成 8 个 bin,并查找 i
组中出现在任何灰色旁边的任何灰度值-组 j
.
中的值
因此我们需要在这个共现矩阵中将超像素图像中的每个标签分开(有 N
个不同的标签或灰度值)。我们还需要指定 "next to" 关系为 [1,0]
或 [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
现在是邻接矩阵。如果超像素 i
和 j
是邻居,则 glcms(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)
将一幅图像分割成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,产生了以下结果:
在回答this question on MATLAB Answers it is hinted that graycomatrix
中是解决这个问题的好方法。但是,这些答案是不完整的。
graycomatrix
需要几个参数来完成我们需要它做的事情。它计算灰度值共生矩阵。这是一个矩阵,表示在单元格 (i,j)
中,灰度值 i
出现在另一个灰度值 j
旁边的频率。 "next to"关系可以在这个函数中定义。默认情况下,graycomatrix
returns 一个 8x8 矩阵,它将图像中的所有灰度值分成 8 个 bin,并查找 i
组中出现在任何灰色旁边的任何灰度值-组 j
.
因此我们需要在这个共现矩阵中将超像素图像中的每个标签分开(有 N
个不同的标签或灰度值)。我们还需要指定 "next to" 关系为 [1,0]
或 [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
现在是邻接矩阵。如果超像素 i
和 j
是邻居,则 glcms(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)