1.实验原理
1.1 JPEG算法概要
JPEG(Joint Photographic Experts Group)是一个由ISO和IEC两个组织机构联合组成的一个专家组,负责制定静态的数字图像数据压缩编码标准,这个专家组开发的算法称为JPEG算法,并且成为国际上通用的标准,因此又称为JPEG标准。JPEG是一个适用范围很广的静态图像数据压缩标准,既可用于灰度图像又可用于彩色图像。
1.2 Z字形编排
量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排,如下图所示。这样就把一个8×8的矩阵变成一个1×64的矢量,频率较低的系数放在矢量的顶部。
1.3 DCT 系数熵编码原理
1.3.1 DC 系数编码: 由于直流系数 F(0,0)反映了该子图像中包含的直流成分,代表8*8个子块的平均值,通常较大,又由 于两个相邻的子图像的直流系数通常具有较大的相关性,所以对 DC 系数采用 差值脉冲编码(DPCM),即对本像素块直流系数与前一像素块直流系数的差值进行无损编码。
1.3.2 AC 系数编码:AC 系数是8×8块的其它63个子块。 首先,进行游程编码(RLC),并在最后加上块结束码(EOB);然后,系 数序列分组,将非零系数和它前面的相邻的全部零系数分在一组内;每组用两 个符号表示[(Run,Size),(Amplitude)] Amplitude:表示非零系数的幅度值;Run:表示零的游程即零的个数;Size: 表示非零系数的幅度值的编码位数;
1.4 JPEG文件的量化表与码表
JPEG使用的颜色是YUV格式。Y分量代表了亮度信息,UV分量代表了色差信息。由人的视觉特性,亮度分量Y分量更重要一些。我们可以对Y采用细量化,对UV采用粗量化,可进一步提高压缩比。所以上面所说的量化表通常有两张,一张是针对Y的,一张是针对UV的,而最后的文件应该有四张码表:亮度的DC、AC码表,色度的DC、AC码表。
1.5 JPEG文件的组织形式
n SOI(0xFFD8),Start of Image,图像开始
n APP0(0xFFE0),Application,应用程序保留标记0
n DQT(0xFFDB),Define Quantization Table,定义量化表
n SOF0(0xFFC0),Start of Frame,帧图像开始
n DHT(0xFFC4),Define Huffman Table,定义哈夫曼表
n SOS(0xFFDA),Start of Scan,扫描开始 12字节
n 压缩数据
n EOI(0xFFD9),End of Image,图像结束 2字节
1.5.2文件组织流格式理解举例
注:加粗部分即为JPEG文件存储数据
FFD8: SOI(Start of Image,图像开始)
所有的 JPEG 文件必须以 SOI 开始
FFE0: APP0(Application,应用程序保留标记-0) length: 16 byte (2 byte)
0010 4A 46 49 46 00 01 01 01 00 48 00 48 0000
标识符: JFIF (5 byte) Version:0101 (2 byte) Units: 01 (1 byte)
X and Y are dots per inch Xdensity:72 (2bytes)
Horizontal pixel density(水平方向点密度) Ydensity: 72 (2 bytes)
Vertical pixel density(垂直方向点密度)
缩略图水平像素数目: 00 (1 byte) 缩略图垂直像素数目: 00 (1 byte)
缩略图 24bitRGB 点数目: 缩略图水平像素数目 * 缩略图垂直像素数目 =00 (1 byte)
FFDB: DQT,Define Quantization Table,定义量化表 length: 67byte (2 byte)
00 43 00 08 06 06 07 06 05 08 07 07 07 09 09 08 0A 0C 140D 0C 0B 0B 0C 19 12 13
0F 14 1D 1A 1F 1E 1D 1A 1C 1C 20 24 2E 27 20 22 2C 231C 1C 28 37 29 2C 30 31
34 34 34 1F 27 39 3D 38 32 3C 2E 33 34 32
QT information - precision: 00 (Higher 4bit) (8 bit) QT information - index: 00 (Lower 4bit)
qt_table:
i: 00 value: 8 i: 01 value: 6 i: 02 value: 6 i: 03 value: 7
i: 04 value: 6 i: 05 value: 5 i: 06 value: 8 i: 07 value: 7
i: 08 value: 7 i: 09 value: 7 i: 10 value: 9 i: 11 value: 9
i: 12 value: 8 i: 13 value: 10 i: 14 value: 12 i: 15 value: 20
i: 16 value: 13 i: 17 value: 12 i: 18 value: 11 i: 19 value: 11
i: 20 value: 12 i: 21 value: 25 i: 22 value: 18 i: 23 value: 19
i: 24 value: 15 i: 25 value: 20 i: 26 value: 29 i: 27 value: 26
i: 28 value: 31 i: 29 value: 30 i: 30 value: 29 i: 31 value: 26
i: 32 value: 28 i: 33 value: 28 i: 34 value: 32 i: 35 value: 36
i: 36 value: 46 i: 37 value: 39 i: 38 value: 32 i: 39 value: 34
i: 40 value: 44 i: 41 value: 35 i: 42 value: 28 i: 43 value: 28
i: 44 value: 40 i: 45 value: 55 i: 46 value: 41 i: 47 value: 44
i: 48 value: 48 i: 49 value: 49 i: 50 value: 52 i: 51 value: 52
i: 52 value: 52 i: 53 value: 31 i: 54 value: 39 i: 55 value: 57
i: 56 value: 61 i: 57 value: 56 i: 58 value: 50 i: 59 value: 60
i: 60 value: 46 i: 61 value: 51 i: 62 value: 52 i: 63 value: 50
此为第一张量化表,量化表标记代码:FFDB
量化表长度:(67byte),长度本身占 2 字节,
精度及量化表 ID: 1byte, 低位为量化表的 ID 的索引值,其取值范围为 0~3,所以说最多可能有四张量化表(亮度量化表,色度量化表,可能会有 R、G、B 各一张量化表);而高位为量化精度,有两个可选值,0:8 位;1:16 位,这里是 00,代表量化精度为 8bit,即用一个字节来表示一个量化系数
数据:64 字节的量化系数,(一个字节对应一个量化系数,对于8*8 的宏块来说,共 8*8=64 个量化系数)
FFDB:DQT(Define Quantization Table),定义量化表 length: 67byte (2 byte)
00 43 01 09 09 09 0C 0B 0C 18 0D 0D 18 32 21 1C 21 32 3232 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 3232 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
QT information - precision: 00 (Higher 4bit) (8 bit)
QT information - index: 01 (Lower 4bit)
qt_table:
i: 00 value: 9 i: 01 value: 9 i: 02 value: 9 i: 03 value: 12
i: 04 value: 11 i: 05 value: 12 i: 06 value: 24 i: 07 value: 13
i: 08 value: 13 i: 09 value: 24 i: 10 value: 50 i: 11 value: 33
i: 12 value: 28 i: 13 value: 33 i: 14 value: 50 i: 15 value: 50
i: 16 value: 50 i: 17 value: 50 i: 18 value: 50 i: 19 value: 50
i: 20 value: 50 i: 21 value: 50 i: 22 value: 50 i: 23 value: 50
i: 24 value: 50 i: 25 value: 50 i: 26 value: 50 i: 27 value: 50
i: 28 value: 50 i: 29 value: 50 i: 30 value: 50 i: 31 value: 50
i: 32 value: 50 i: 33 value: 50 i: 34 value: 50 i: 35 value: 50
i: 36 value: 50 i: 37 value: 50 i: 38 value: 50 i: 39 value: 50
i: 40 value: 50 i: 41 value: 50 i: 42 value: 50 i: 43 value: 50
i: 44 value: 50 i: 45 value: 50 i: 46 value: 50 i: 47 value: 50
i: 48 value: 50 i: 49 value: 50 i: 50 value: 50 i: 51 value: 50
i: 52 value: 50 i: 53 value: 50 i: 54 value: 50 i: 55 value: 50
i: 56 value: 50 i: 57 value: 50 i: 58 value: 50 i: 59 value: 50
i: 60 value: 50 i: 61 value: 50 i: 62 value: 50 i: 63 value: 50
此为第二张量化表,不同的是上张表的索引号为 00,这张表的索引号为 01,在后面的 SOF0 的部分中我们将会知道上张表对应亮度量化表,这张表对应色度量化表,对这张图来说就这两张量化表。
FFC0: SOF0