【问题标题】:Mean color for each superpixel in an image in the CIELAB color spaceCIELAB 颜色空间中图像中每个超像素的平均颜色
【发布时间】:2019-07-24 08:51:21
【问题描述】:

根据 MA​​TLAB 测量每个超像素的平均颜色的帮助,我将图像分割为 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颜色空间的通道平均颜色测量中,代码有问题吗?

【问题讨论】:

  • 我在 MATLAB 2018 中编写代码。
  • 我使用 MATLAB help.RGB 有 3 个通道,确定平均颜色是在每个通道内完成的。但是由于 CIELAB 颜色空间的特性,我不知道如何测量图像从 RGB 到 CIELAB 颜色空间转换后的每个超像素的平均颜色?
  • 它可能对你有用:mathworks.com/matlabcentral/answers/…
  • 图片在蓝色链接中。
  • @CrisLuengo,请让我知道您对代码和图像的评论。谢谢

标签: image matlab image-processing image-segmentation


【解决方案1】:

这里的主要问题是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 是属于这个超像素的像素。

【讨论】:

  • 感谢您的回答,如果我使用 RGB 图像计算超像素,应该在哪一步转换到 LAB?通过考虑您上面提到的每个 LAB 通道的范围,LAB 通道的平均颜色的测量是否已在代码中正确完成?
  • @dtr43:从 RGB 图像 B 计算超像素,然后在计算平均值时使用 Lab 图像 A。转换将在您需要 A 之前随时完成。
  • 感谢您的帮助,在测量 CIELAB 颜色空间中的平均颜色后,我得到了“输出图像”图像,超像素区域的颜色是平均 LAB 颜色。如何访问新图像中每个像素具有平均 LAB 颜色的这些超像素?
  • @dtr43:您可以将图像转换为RGB进行显示。
  • "Lab" 表示通道的顺序。 L是第一个通道,a是第二个,b是第三个。尝试imshow(L==ii)(对于介于 1 和N 之间的任何给定数字ii),您将看到一个二进制图像,其中超像素ii 的像素被选中。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答,换句话说,我可以测量 CIELAB 颜色空间中每个超像素的平均值,并将输出图像上传到此链接:uploadfiles.io/jl4oy 我的问题是如何访问对每个超像素中的这个平均值分别进行一些操作,例如欧几里得距离,... 超像素之间?
  • 非常感谢您的新回答。我真的需要那个。
猜你喜欢
  • 2019-04-08
  • 2015-04-12
  • 2012-07-28
  • 2012-02-16
  • 2020-02-15
  • 2019-09-17
  • 2015-06-05
  • 2019-08-01
  • 2017-05-25
相关资源
最近更新 更多