image and video processing聽課筆記(三)

昨天把JPEG壓縮過程梳理完畢,今天給出實現前向DCT代碼,更詳細的過程可以問wiki姐姐

首先把圖像分割出不重合的8*8小塊,

下面以將64*64圖像4*4分塊爲例(實際運用時,如果圖像分辨率不是4的整數倍,可以取模在後面的轉換過程忽略餘下部分)

B=reshape(cat(3,B{:}),16,[]);%B就是要求的矩陣,16行256列 

%下面是說明
%大概的關係是這樣的,設A= 
%A1 A17 … A241 
%A2 A18 … A242 
%∶ ∶ ∶ 
%A16 A19 … A256 
%(這裏每個Ai都是4*4的矩陣塊) 
%那麼B= 
%B1 B2 B3 … B256 
%每個Bi就是對應Ai的16*1列向量 
% 
%即假設Ai= 
%a1 a5 a9 a13 
%a2 a6 a10 a14 
%a3 a7 a11 a15 
%a4 a8 a12 a16 
% 
%那麼Bi= 
%a1 
%a2 
%∶ 
%a16

現在對其中一個8*8blockDCT轉換

% this is a given 8x8 subimage. 
 SI = [ 52, 55, 61,  66,  70,  61, 64, 73;
        63, 59, 55,  90, 109,  85, 69, 72;
        62, 59, 68, 113, 144, 104, 66, 73;
        63, 58, 71, 122, 154, 106, 70, 69;
        67, 61, 68, 104, 126,  88, 68, 70;
        79, 65, 60,  70,  77,  68, 58, 75;
        85, 71, 64,  59,  55,  61, 65, 83;
        87, 79, 69,  68,  65,  76, 78, 94];
 
 
SI=SI-128;
n=8;
 
TT=zeros(n,n);
for u=0:n-1
    for v=0:n-1
        for x=0:n-1
            for y=0:n-1
                TT(u+1,v+1)=TT(u+1,v+1)+myalpha(u,n)*myalpha(v,n)*SI(x+1,y+1)*mydct(x,y,u,v,n);
            end
        end
    end
end
 
TT=round(TT);
%myalpha
function result = myalpha(u,n)
if u == 0
    result = sqrt(1/n);
else
    result = sqrt(2/n);
end
end
%mydct
function myresult = mydct(x,y,u,v,n)
    myresult = cos(((2*x+1)*u*pi)/(2*n))*cos(((2*y+1)*v*pi)/(2*n));
end

end


計算出來應該和下面的結果一樣:



後面量化和編碼過程用到量化表和Huffman coding,這裏就不再多言啦大笑



發佈了28 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章