图像、视频压缩的必要性:
设图像为720 * 480, 且为RGB图,每个色道位深为8, 故该图像的大小为:720 * 480 * 3 B = 0.99 MB(很大,很吓人.),如果是视频,就更是吓人.
图像、视频压缩的可行性:
1. 视觉冗余(下采样,量化)
2. 空间时间冗余 (帧内帧间预测)
3. 数学冗余 (熵编码)
下面来简要仿真JPEG的编解码过程,matlab代码如下:
clear
clc
% 原始像素值
pix = [52 55 61 66 70 61 64 73;...
63 59 66 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 63 58 75;...
85 71 64 59 55 61 65 83;...
87 79 69 68 65 76 78 94]
% 差值
X = pix - 128
%变换矩阵
A = dctmtx(8)
% DCT变换
Y = round(A * X * A')
% JPEG亮度量化表
Qstep = [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]
% 量化
QDCT = round(Y ./ Qstep)
% 因为熵编码无损,所以在此省略了熵编码和熵解码
% 反量化
decY = QDCT .* Qstep
% 反DCT
decX = round(A' * decY * A)
%恢复
decPix = decX + 128
%比较
delta = decPix - pix
结果为:
pix =
52 55 61 66 70 61 64 73
63 59 66 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 63 58 75
85 71 64 59 55 61 65 83
87 79 69 68 65 76 78 94
X =
-76 -73 -67 -62 -58 -67 -64 -55
-65 -69 -62 -38 -19 -43 -59 -56
-66 -69 -60 -15 16 -24 -62 -55
-65 -70 -57 -6 26 -22 -58 -59
-61 -67 -60 -24 -2 -40 -60 -58
-49 -63 -68 -58 -51 -65 -70 -53
-43 -57 -64 -69 -73 -67 -63 -45
-41 -49 -59 -60 -63 -52 -50 -34
A =
0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536
0.4904 0.4157 0.2778 0.0975 -0.0975 -0.2778 -0.4157 -0.4904
0.4619 0.1913 -0.1913 -0.4619 -0.4619 -0.1913 0.1913 0.4619
0.4157 -0.0975 -0.4904 -0.2778 0.2778 0.4904 0.0975 -0.4157
0.3536 -0.3536 -0.3536 0.3536 0.3536 -0.3536 -0.3536 0.3536
0.2778 -0.4904 0.0975 0.4157 -0.4157 -0.0975 0.4904 -0.2778
0.1913 -0.4619 0.4619 -0.1913 -0.1913 0.4619 -0.4619 0.1913
0.0975 -0.2778 0.4157 -0.4904 0.4904 -0.4157 0.2778 -0.0975
Y =
-415 -29 -62 24 55 -20 -1 3
7 -21 -62 9 11 -7 -6 6
-46 8 77 -25 -30 10 7 -5
-50 12 35 -15 -9 6 0 3
11 -8 -13 -1 -1 1 -4 1
-9 1 3 -3 -1 0 2 -1
-4 -1 2 -1 2 -3 1 -2
-1 -1 -1 -2 -1 -1 0 0
Qstep =
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
QDCT =
-26 -3 -6 2 2 -1 0 0
1 -2 -4 0 0 0 0 0
-3 1 5 -1 -1 0 0 0
-4 1 2 -1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
decY =
-416 -33 -60 32 48 -40 0 0
12 -24 -56 0 0 0 0 0
-42 13 80 -24 -40 0 0 0
-56 17 44 -29 0 0 0 0
18 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
decX =
-74 -57 -62 -70 -63 -65 -65 -46
-76 -66 -62 -45 -24 -38 -60 -55
-72 -71 -59 -15 19 -11 -55 -60
-63 -70 -58 -6 27 -12 -58 -56
-58 -68 -65 -28 -7 -42 -70 -52
-56 -64 -73 -60 -48 -69 -78 -50
-49 -52 -71 -74 -61 -66 -68 -46
-39 -40 -62 -72 -53 -47 -50 -40
decPix =
54 71 66 58 65 63 63 82
52 62 66 83 104 90 68 73
56 57 69 113 147 117 73 68
65 58 70 122 155 116 70 72
70 60 63 100 121 86 58 76
72 64 55 68 80 59 50 78
79 76 57 54 67 62 60 82
89 88 66 56 75 81 78 88
delta =
2 16 5 -8 -5 2 -1 9
-11 3 0 -7 -5 5 -1 1
-6 -2 1 0 3 13 7 -5
2 0 -1 0 1 10 0 3
3 -1 -5 -4 -5 -2 -10 6
-7 -1 -5 -2 3 -4 -8 3
-6 5 -7 -5 12 1 -5 -1
2 9 -3 -12 10 5 0 -6
上述仿真结果和冈萨雷斯书上的结果几乎完全一致(有个别像素不一致,极有可能是matlab过早利用浮点数代替无理数所致),从而也说明上述仿真过程是正确的.
JPEG编解码原理就是这样的.