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

为什么使用MATLAB将RGB转换为l*a*b*颜色值时输出错误?,matlab,colors,matlab-figure,Matlab,Colors,Matlab Figure,我有一个绿色背景的图像,在我的材料(一些南瓜)周围有一些阴影。我想删除背景和阴影,然后将RGB颜色转换为lab*并分离l*,a*,b*。最后得到l*、a*、b*值的平均值。这些是我的代码: 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

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

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)); 
I=imread('006.jpg');%导入图像
I=双(I)。/255;%转换为双精度
I=imresize(I,0.25);%调整图像大小
G=I(:,:,2)-I(:,:,1)-I(:,:,3);%绿色(2)与红色(1)和蓝色(3)相比如何
L=I.*repmat(G<0[1,1,3]);%删除所有绿色的值
%将rgb转换为实验室
L=makecform('srgb2lab');
lab=应用形式(I,L);
%单独的l、a、b值
l=实验室(:,:,1);
a=实验室(:,:,2);
b=实验室(:,:,3);
%计算平均值
lm=平均值(平均值(l));
am=平均值(平均值(a));
bm=平均值(平均值(b));
最后,这些代码给出了l=82,a=-31,b=78。 但它们是错误的,因为我用数字颜色计检查这些值的范围,它们应该大约像l=70,a=17,b=66。我认为这些代码显示了我删除的背景的实验室值,而不是材料的实验室值!!!!
我能做什么

如果您有MATLAB>R2014b,请根据自身使用而不是
makecform
applycform

这可能会解决您的问题,因为我认为您没有将转换应用于正确的图像。不带绿色(
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)); 
I=imread('006.jpg');%导入图像
I=双(I)。/255;%转换为双精度
I=imresize(I,0.25);%调整图像大小
%将rgb转换为实验室
lab=rgb2lab(I);
%单独的l、a、b值
l=实验室(:,:,1);
a=实验室(:,:,2);
b=实验室(:,:,3);
%计算平均值
G=I(:,:2)-I(:,:,1)-I(:,:,3);%绿色(2)与红色(1)和蓝色(3)相比如何
I_材料=G<0;%是材料0/1吗
lm=平均值(l(I_材料));
am=平均值(a(I_材料));
bm=平均值(b(I_材料));

您的解决方案很棒,谢谢。我使用MATLAB>R2015b。你能详细解释一下使用
rgb2lab
而不是
makecform
applycform
之间的区别吗?我自己从来没有使用过这些函数,所以说不出有什么区别。我刚才引用了文件。查看文档,我可以告诉您默认的参考白点不同(
d65
vs
icc)
,并且
rgb2lab
还有一些选项可用。如果我的答案是肯定的,请点击左边空白处的复选标记接受。
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));