根据MATLAB的帮助来测量每个超像素的平均颜色,我将图像分割为200个超像素,并尝试将输出图像中每个像素的颜色设置为超像素区域的平均CIELAB颜色。 输入图像如下所示:
B=imread('H.jpg');
A=rgb2lab(B); // conversion from rgb to lab
[L,N] = superpixels(A,200);
figure
BW = boundarymask(L);
imshow(imoverlay(A,BW,'cyan'),'InitialMagnification',67);
outputImage = zeros(size(A),'like',A);
idx = label2idx(L);
numRows = size(A,1);
numCols = size(A,2);
for labelVal = 1:N
redIdx = idx{labelVal};
greenIdx = idx{labelVal}+numRows*numCols;
blueIdx = idx{labelVal}+2*numRows*numCols;
outputImage(redIdx) = mean(A(redIdx));
outputImage(greenIdx) = mean(A(greenIdx));
outputImage(blueIdx) = mean(A(blueIdx));
end
figure
imshow(outputImage,'InitialMagnification',67);
我不确定此代码的输出是否能正确给我CIELAB颜色空间中每个超像素的平均颜色。与RGB颜色空间相比,图像的颜色是否如此不同?还是代码不正确?在测量CIELAB色彩空间通道的平均色彩时,代码中是否存在任何问题?
答案 0 :(得分:3)
这里的主要问题是imshow
所显示的不是数据所包含的内容。
imshow
输入, double
假定像素值在[0,1]范围内。 Lab的第一个通道的范围是[0,100],我相信其他两个通道的范围是[-20,20](也许是不同的,但是这两个通道在0左右对称,呈灰色)。>
如果您执行imshow(A,[])
,则数据将按比例缩放以向您显示所有内容。因此,所有通道的缩放比例相同,因此也不是查看数据的最佳方法,但是无论如何,L通道将显示为红色,a和b通道将显示为绿色和蓝色。即使您仍然拥有恢复原始图像的所有数据,也不要指望它看起来完全像原始图像。
接下来,(it turns out有使用Lab输入图像的选项)。superpixels
需要RGB图像作为输入,请考虑传递原始图像B
,而不是Lab图像A
。这不会妨碍您计算发现的超像素内的Lab通道的方法。
如果要测量每个超像素中的平均Lab值并将其用于进一步处理,请不要创建outputImage
,而要创建一个包含这些值的表格:
data = zeros(N,3);
for labelVal = 1:N
redIdx = idx{labelVal};
greenIdx = idx{labelVal}+numRows*numCols;
blueIdx = idx{labelVal}+2*numRows*numCols;
data(labelVal,1) = mean(A(redIdx));
data(labelVal,2) = mean(A(greenIdx));
data(labelVal,3) = mean(A(blueIdx));
end
现在,data(ii,:)
是超像素编号ii
的Lab值。 L==ii
是属于该超像素的像素。
答案 1 :(得分:3)
请注意,尽管超像素算法SLIC在L * a * b *空间中运行,但它希望将RGB图像作为输入。如果要像在用例中那样预先计算L * a * b *表示形式以供下游使用,则需要使用'IsInputLab'名称/值。否则,该算法将尝试将已经为L * a * b *的图像转换为L * a * b *。
您要
B=imread('H.jpg');
A=rgb2lab(B);
[L,N] = superpixels(A, 200,'IsInputLab',true);
Chris Lueno率先回答了超像素图中特征的均值计算问题。超像素之间的距离是相似的,您实际上是在计算每个超像素的质心特征以描述其位置,然后测量它们之间的距离。请注意,在下面的代码中,矩阵围绕其对角线对称,对角线为0。如果您对此有所关注,我会留给您,以提高效率。
distanceMatrix = zeros(N,N);
for m = 1:N
for n = 1:n
[i1,j1] = ind2sub(size(A),idx{m});
[i1,j2] = ind2sub(size(A),idx{n});
Icenter1 = mean(i1);
Jcenter1 = mean(j1);
Icenter2 = mean(i2);
Jcenter2 = mean(j2);
distanceMatrix(m,n) = sqrt((Icenter1-Icenter2)^2+(Jcenter1-Jcenter2)^2);
end
end