CIELAB颜色空间中图像中每个超像素的平均颜色

时间:2019-03-02 14:33:16

标签: image matlab image-processing image-segmentation

根据MATLAB的帮助来测量每个超像素的平均颜色,我将图像分割为200个超像素,并尝试将输出图像中每个像素的颜色设置为超像素区域的平均CIELAB颜色。 输入图像如下所示:

The input image

B=imread('H.jpg');
A=rgb2lab(B);    // conversion from rgb to lab

output of command of imshow(A,[])

[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);

segmented image in the CIELAB color space

mean color of each superpixel in the CIELAB color space

我不确定此代码的输出是否能正确给我CIELAB颜色空间中每个超像素的平均颜色。与RGB颜色空间相比,图像的颜色是否如此不同?还是代码不正确?在测量CIELAB色彩空间通道的平均色彩时,代码中是否存在任何问题?

2 个答案:

答案 0 :(得分:3)

这里的主要问题是imshow所显示的不是数据所包含的内容。

对于imshow输入,

double假定像素值在[0,1]范围内。 Lab的第一个通道的范围是[0,100],我相信其他两个通道的范围是[-20,20](也许是不同的,但是这两个通道在0左右对称,呈灰色)。

如果您执行imshow(A,[]),则数据将按比例缩放以向您显示所有内容。因此,所有通道的缩放比例相同,因此也不是查看数据的最佳方法,但是无论如何,L通道将显示为红色,a和b通道将显示为绿色和蓝色。即使您仍然拥有恢复原始图像的所有数据,也不要指望它看起来完全像原始图像。

接下来,superpixels需要RGB图像作为输入,请考虑传递原始图像B,而不是Lab图像A。这不会妨碍您计算发现的超像素内的Lab通道的方法。it turns out有使用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