首页 > 解决方案 > CIELAB 颜色空间中图像中每个超像素的平均颜色

问题描述

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

输入图像

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

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

CIELAB 颜色空间中的分割图像

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

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

标签: imagematlabimage-processingimage-segmentation

解决方案


这里的主要问题是,imshow向您展示的不是数据包含的内容。

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

如果你这样做了,imshow(A,[])那么数据将被缩放以向你展示一切。因此,所有通道的缩放比例都相同,因此这也不是查看数据的最佳方式,但无论如何,L 通道将显示为红色,a 和 b 通道显示为绿色和蓝色。不要期望这看起来像您的原始图像,即使您仍然拥有恢复原始图像的所有数据。

接下来,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,:)是超像素数的 Lab 值iiL==ii是属于这个超像素的像素。


推荐阅读