2017-05-06 87 views
0

我有我的材料(南瓜的一些片段)周圍的綠色背景和一些陰影的圖像。我想刪除背景和陰影,然後將RGB顏色轉換爲l a b *並分開l *,a *,b *。最終得到平均L *,A *,B * values.these的是我的代碼:爲什麼使用MATLAB將RGB轉換爲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

如果你有MATLAB> R2014b,使用rgb2lab代替makecformapplycform,按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)); 
+0

您的解決方案非常好,謝謝。我使用MATLAB> R2015b。你能解釋一下使用'rgb2lab'而不是'makecform'和'applycform'的區別嗎? – parisa

+0

我真的不知道區別,因爲我從未使用過任何這些功能。我剛剛引用了文檔。檢查文檔,我可以告訴你,默認的參考白點不同('d65' vs'icc)'''rgb2lab'還有幾個選項可用。如果我的答案沒問題,請點擊左邊的複選標記來接受它。 –