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

时间:2017-05-06 07:04:54

标签: matlab colors matlab-figure

我有一张绿色背景的图像和我的材料周围的一些阴影(一些南瓜片)。我想删除背景和阴影,然后将RGB颜色转换为l a b *并分离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)); 

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

1 个答案:

答案 0 :(得分:0)

如果你有MATLAB&gt; R2014b,根据rgb2lab本身使用makecform doc代替makecformapplycform

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