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

Image CIELAB颜色空间中图像中每个超级像素的平均颜色,image,matlab,image-processing,image-segmentation,Image,Matlab,Image Processing,Image Segmentation,根据MATLAB测量每个超级像素平均颜色的帮助,我将图像分割为200个超级像素,并尝试将输出图像中每个像素的颜色设置为超级像素区域的平均CIELAB颜色。 输入图像如下所示: B=imread('H.jpg'); A=rgb2lab(B); // conversion from rgb to lab 我不确定这段代码的输出是否正确地给出了CIELAB颜色空间中每个超级像素的正确平均颜色。与RGB颜色空间相比,图像是否具有如此不同的颜色,或者代码是否不正确?在CIELAB颜色空间通

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

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


我不确定这段代码的输出是否正确地给出了CIELAB颜色空间中每个超级像素的正确平均颜色。与RGB颜色空间相比,图像是否具有如此不同的颜色,或者代码是否不正确?在CIELAB颜色空间通道平均颜色的测量中,代码中是否存在任何问题?

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

imshow
假设对于
double
输入,像素值在[0,1]范围内。Lab在第一个通道中的范围为[0100],我相信在其他两个通道中的范围为[-20,20](可能不同,但这两个通道在0左右对称,即灰色)

如果执行
imshow(A,[])
操作,则数据将缩放以显示所有内容。因此,将缩放所有通道,因此这也不是查看数据的最佳方式,但在任何情况下,L通道将显示为红色,a和b通道将显示为绿色和蓝色。不要期望它看起来像您的原始图像,即使您仍然拥有恢复原始图像的所有数据

下一步,<代码>超像素期望RGB图像作为输入,考虑传递原始图像<代码> B<代码>,而不是实验室图像<代码> A<代码>。这不会妨碍您计算找到的超级像素中实验室通道的方法。(有一个使用实验室输入图像的选项)

如果要测量每个超级像素内的平均Lab值并在进一步处理中使用,请不要创建
输出图像
,而是创建包含这些值的表:

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
的实验室值
L==ii
是属于此超级像素的像素。

请注意,尽管超级像素算法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

我在MATLAB 2018中编写代码。我使用MATLAB帮助。RGB有3个通道,在每个通道中确定平均颜色。但由于CIELAB颜色空间的特性,我不知道如何测量图像从RGB转换到CIELAB颜色空间后每个超级像素的平均颜色?这可能对您有用:图像以蓝色链接显示。@CrisLuengo,请告诉我您对代码和图像的评论。谢谢你的回答,如果我使用RGB图像计算超级像素,那么应该在哪一步转换到实验室?通过考虑您上面提到的每个实验室通道的范围,在代码中正确地测量了实验室通道的平均颜色?@dtr43:从RGB图像
B
计算超级像素,然后在计算平均值时使用实验室图像
A
。转换将在您需要
A
之前随时完成。感谢您的帮助,在测量CIELAB颜色空间中的平均颜色后,我得到了“outputImage”图像,超级像素区域的颜色是平均实验室颜色。如何访问新图像中的这些超级像素,使每个像素具有平均的LAB颜色?@dtr43:您可以将图像转换为RGB进行显示。“LAB”表示通道的顺序。L是第一个通道,a是第二个通道,b是第三个通道。尝试
imshow(L==ii)
(对于介于1和
N
之间的任何给定数字
ii
),您将看到一个选择了超级像素
ii
的二值图像。换句话说,感谢您的回答,我可以测量CIELAB颜色空间中每个超级像素的平均值,输出图像上传到这个链接中:我的问题是如何分别访问每个超级像素的平均值来执行一些操作,例如欧几里德距离。。。超级像素之间?非常感谢你的新答案。我真的需要。
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