昨天把JPEG压缩过程梳理完毕,今天给出实现前向DCT代码,更详细的过程可以问wiki姐姐
现在对其中一个8*8的block做DCT转换
首先把图像分割出不重合的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,这里就不再多言啦。