2012-04-05 29 views
1

我正在爲H.264的視頻實現DCT。我已經閱讀了幾本書,並遵循了他們指定的係數。即使有了這些,我在做IDCT時似乎並沒有得到正確的圖像。請幫助我提供任何類型的信息。謝謝! 我的代碼是:用於H.264的DCT實現

clear all; 
clc; 

%% DCT, IDCT 

image=imread('foreman_166.gif'); 
figure(1); 
imshow(image);title('Original image'); 


%taking the luminance value of the image 
image_ycbcr=rgb2ycbcr(image); 
%luminance=image_ycbcr(:,:,1); 
luminance=double(image_ycbcr(:,:,1)); 

[M N]=size(luminance); 
dctmat=[1 1 1 1;2 1 -1 -2;1 -1 -1 1;1 -2 2 -1]; 
dct_mat=dctmat(:); %16*1 matrix 
%idctmat=inv(dctmat); 
%idctmat=[1 1 1 0.5;1 0.5 -1 -1;1 -0.5 -1 1;1 -1 1 -0.5]; 
idctmat=[1 1 1 1;1 0.5 -0.5 -1;1 -1 -1 1;0.5 -1 1 -0.5]; 
%idctmat=uint8(idctmat); 
idct_mat=idctmat(:); %16*1 matrix 
dctimage=zeros(M,N); % dct of the image 
idctimage=zeros(M,N); 
c=ones(1,16); 
transformedblock=ones(4,4); 
a=1/2;b=(2/5)^0.5;d=1/2; 
scaling_mat=[a^2 a*b/2 a^2 a*b/2;a*b/2 b^2/4 a*b/2 b^2/4; a^2 a*b/2 a^2 a*b/2;a*b/2 b^2/4 a*b/2 b^2/4]; 
inv_scalingmat=[a^2 a*b a^2 a*b; a*b b^2 a*b b^2; a^2 a*b a^2 a*b; a*b b^2 a*b b^2]; 



%dft for 4*4 blocks 
for i=1:4:M 
    for j=1:4:N 

     block=luminance(i:i+3,j:j+3); 
     b=block(:); %16*1 matrix 
     %b=b-mean(b); %shifting mean to 0 
%   for l=1:16 
%    c(l)=dct_mat(l)*b(l); % c=1*16, X=Hx X=c 
%   end 
%   transformedblock(:,1)=c(1:4); 
%   transformedblock(:,2)=c(5:8); 
%   transformedblock(:,3)=c(9:12); 
%   transformedblock(:,4)=c(13:16); 
%    
     %transformedblock=dctmat*block;   %X=Hx 
     transformedblock=dctmat*block*dctmat'; %tranformed block 
     transformedblock=transformedblock*scaling_mat; 
     %transformedblock=transformedblock*diag([1/4,1/5,1/4,1/5]); 
     dctimage(i:i+3,j:j+3)=transformedblock;  

    end 
end 

figure(2); 
imshow((abs(dctimage)));title('dct of the image'); 


dctimage(abs(dctimage)<10) = 0; 
%inverse dct 
for i=1:4:M 
    for j=1:4:N 

     block=dctimage(i:i+3,j:j+3); 
%   b=block(:); %16*1 matrix 
%   %b=b-mean(b); %shifting mean to 0 
%   for l=1:16 
%    c(l)=idct_mat(l)*b(l); % c=1*16, X=Hx X=c 
%   end 
%   invtransformedblock(:,1)=c(1:4); 
%   invtransformedblock(:,2)=c(5:8); 
%   invtransformedblock(:,3)=c(9:12); 
%   invtransformedblock(:,4)=c(13:16); 
%   
     %invtransformedblock=idctmat*block; 
     invtransformedblock=idctmat'*(block*inv_scalingmat)*idctmat; %tranformed block 
     idctimage(i:i+3,j:j+3)=invtransformedblock;  

    end 
end 

figure(3); 
imshow(idctimage,[0 255]);title('inverse DCT image'); 
+0

該主題更好地[信號處理處理](HTTP:// HTTP://dsp.stackexchange.com /)網站。但不要過多關注代碼。 – 2012-04-09 09:27:32

回答

0

很簡單只是將此轉換:

transformedblock=transformedblock*scaling_mat; 

invtransformedblock=idctmat'*(block*inv_scalingmat)*idctmat; 

這樣:

transformedblock=transformedblock.*scaling_mat; 
invtransformedblock=idctmat'*(block.*inv_scalingmat)*idctmat;