2015-03-25 171 views
2

我想將RGB圖片轉換爲YUV,並將其還原。但是當我在MATLAB中計算時,發現圖片並不完全正確。這裏是我在matlab中的操作! 這裏是我的代碼:如何將RGB轉換爲YUV在整數,然後恢復

%M file 
clear all; 
clc; 
RGB = imread('11111.bmp'); 
figure;imshow(RGB); 

R = RGB(:,:,1); 
G = RGB(:,:,2); 
B = RGB(:,:,3); 

Y0= 0.256788*R + 0.504129*G + 0.097906*B + 16; 
U0=-0.148223*R - 0.290993*G + 0.439216*B + 128; 
V0= 0.439216*R - 0.367788*G - 0.071427*B + 128; 
Y= uint8(min(255,max(0,Y0)));% i want 8 bit YUV 
U= uint8(min(255,max(0,U0))); 
V= uint8(min(255,max(0,V0))); 
RGB1R=Y+1.14 *V; 
RGB1G=Y-0.39 *U-0.58*V; 
RGB1B=Y+2.03*U; 
RGB1=cat(3, RGB1R, RGB1G, RGB1B); 
figure; imshow(RGB1); 
%M file 

應該指出的是,圖像是膠囊內鏡image.you可以得到它在wwww.gastrolab.net。我希望YUV是8位整數,可能有人幫助我嗎? ?

+0

我假設你想這樣做,而不是使用MATLAB的內置函數,對吧? – hbaderts 2015-03-25 09:08:45

+0

你的意思是我用一個真正的CMOS光學傳感器實現這種方法? – 2015-03-26 08:00:29

+0

不,問題是:該解決方案是否可以包含像'rgb2ycbcr()這樣的MATLAB命令?或者您是否想要使用像'Y0 = 0.256788 * R + 0.504129 * G + 0.097906 * B + 16'這樣的公式來做到這一點? – hbaderts 2015-03-26 08:38:34

回答

0

爲了在RGB和YCbCr之間進行轉換,MATLAB提供了功能rgb2ycbcrycbcr2rgb。 YCbCr和YUV然後由

Y = Y 
U = 0.872021 Cb 
V = 1.229951 Cr 

有關將RGB圖像轉換爲YUV,因此您能使用

RGB = imread('11111.bmp'); 
YCBCR = rgb2ycbcr(RGB); 
YUV(:,:,1) = YCBCR(:,:,1);    % Y -> Y 
YUV(:,:,2) = 0.872021 * YCBCR(:,:,2); % Cb -> U 
YUV(:,:,3) = 1.229951 * YCBCR(:,:,3); % Cr -> V 

,並把它轉換回來,用

YCBCR1(:,:,1) = YUV(:,:,1);    % Y -> Y 
YCBCR1(:,:,2) = YUV(:,:,2)/0.872021; % U -> Cb 
YCBCR1(:,:,3) = YUV(:,:,3)/1.229951; % V -> Cr 
RGB1 = ycbcr2rgb(YCBCR1); 

注意,如果您正在使用uint8作爲RGB的類型,那麼YCBCRYUV也將爲uint8,轉換將是有損的。對於我的testimage,RGBRGB1之間的最大區別是

max(abs(RGB(:)-RGB1(:))) 
ans = 
    4 

爲了有一個無損轉換,你應該使用double數據類型。請注意,MATLAB假定uint8圖像的值在0和255之間,而double圖像的值在0和1之間,所以需要對它們進行縮放。

+0

謝謝,你的答案是我想要的,再次感謝你 – 2015-03-27 11:45:59

+0

這就是它,我在matlab中運行它,現在是好的。 – 2015-03-27 11:53:27

+0

好,完美。如果此(或任何)答案已解決您的問題,請點擊複選標記考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。雖然當然沒有義務這樣做。 – hbaderts 2015-03-27 12:25:17