为什么我使用 MATLAB 将 RGB 转换为 l*a*b* 颜色值时输出错误?

Why I got wrong outputs for converting RGB to l*a*b* color values using MATLAB?

我有一张绿色背景的图像,我的材料(一些南瓜片)周围有一些阴影。我想去除背景和阴影,然后将 RGB 颜色转换为 lab* 并分离 l*、a*、b*。终于得到 l*、a*、b* 的平均值 values.these 是我的代码:

I=imread('006.jpg');   %import image
I=double(I)./255;   %convert to double
I=imresize(I,0.25);    %resize image
G=I(:,:,2)-I(:,:,1)-I(:,:,3);   %how green(2) compared to red(1) and blue(3)
L=I.*repmat(G < 0,[1,1,3]);   %remove all values that are green
%convert rgb to lab
L=makecform('srgb2lab');
lab=applycform(I,L); 
%separate l, a, b values
l=lab(:,:,1);
a=lab(:,:,2);
b=lab(:,:,3);
%calculate mean values
lm=mean(mean(l));
am=mean(mean(a));
bm=mean(mean(b)); 

最后,这些代码给我 l=82,a=-31,b=78。 但它们是错误的,因为我用数字色度计检查了这些值的范围,它们应该大约像 l=70、a=17、b=66。我认为这些代码显示的是我删除的背景的实验室值,而不是材料的实验室值!!!! 我能做什么?

如果您有 MATLAB > R2014b,请使用 rgb2lab instead of makecform and applycform, as per makecform doc 本身:

lab = rgb2lab(L);

这可能会解决您的问题,因为我认为您没有将转换应用于正确的图像。没有绿色的图像 (L) 未被使用,因为 L 用于存储下一行的转换数据。然后将转换应用于 I 而不是 L,因为它不再存在。

也就是说,您的代码计算整个图像的平均值,而不仅仅是材质部分,因为背景被涂黑且未被移除。如果您只想要材料的平均值,您可以执行以下操作:

I=imread('006.jpg');   %import image
I=double(I)./255;   %convert to double
I=imresize(I,0.25);    %resize image
%convert rgb to lab
lab=rgb2lab(I);
%separate l, a, b values
l=lab(:,:,1);
a=lab(:,:,2);
b=lab(:,:,3);
%calculate mean values
G=I(:,:2)-I(:,:,1)-I(:,:,3);   %how green(2) compared to red(1) and blue(3)
I_materials = G < 0; % is materials 0/1
lm=mean(l(I_materials));
am=mean(a(I_materials));
bm=mean(b(I_materials));