我有一张绿色背景的图像和我的材料周围的一些阴影(一些南瓜片)。我想删除背景和阴影,然后将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。我认为这些代码显示了我已删除的背景的实验室值,而不是材料的实验室值! 我能做什么?
答案 0 :(得分:0)
如果你有MATLAB&gt; R2014b,根据rgb2lab本身使用makecform doc代替makecform
和applycform
:
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));