首先把圖像分割出不重合的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*8的block做DCT轉換
% 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,這裏就不再多言啦。