clc; clear;
% an example image
img = [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];
% all sub 128
img2 = img - 128;
% Discrete Cosine Transform
for u = 0:7
for v = 0:7
G(u+1,v+1) = 0;
for x = 0:7
for y = 0:7
G(u+1,v+1) = G(u+1,v+1) + img2(x+1,y+1)*cos(pi/8*(x+0.5)*u)*cos(pi/8*(y+0.5)*v);
end
end
G(u+1,v+1) = a(u)*a(v)*G(u+1,v+1);
G(u+1,v+1) = round(G(u+1,v+1)*100)/100;
end
end
% Quantization table
Q = [16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99];
for j = 0:7
for k = 0:7
B(j+1,k+1) = round(G(j+1,k+1)/Q(j+1,k+1));
end
end
% Decoding
for j = 0:7
for k = 0:7
D(j+1,k+1) = B(j+1,k+1)*Q(j+1,k+1);
end
end
% inverse Discrete Cosine Transform
for x = 0:7
for y = 0:7
f(x+1,y+1) = 0;
for u = 0:7
for v = 0:7
f(x+1,y+1) = f(x+1,y+1) + a(u)*a(v)*D(u+1,v+1)*cos(pi/8*(x+0.5)*u)*cos(pi/8*(y+0.5)*v);
end
end
f(x+1,y+1) = round(f(x+1,y+1));
end
end
% all add 128
f2 = f+128;
把維基百科裡面介紹JPEG的內容用Matlab實作出來了
總算把最後的IDCT也實驗出來了
不過這還不能夠交這次的作業,還需要不少的修改