实验六 JPEG编码
一、实验内容及目的
1.了解JPEG编码基本原理和编码过程。
2.在了解编码模块的基础上改写部分C程序,利用汇编语言对之进行优化编码。 1. 和 和 二、实验设备
P4 PC机(2000或 XP系统),CCS5000开发环境(v2.2)DSP图像处理实验箱,DSP仿真器,DC12V电源,USB线,麦克风等。
三、实验原理
JPEG(joint picture expert group)是针对静止灰度或彩色图像的压缩标准。 (一) JPEG编码基本系统模型
DCT变换8图像块码表量化变字长编码数据数据变字长解码反量化反DCT变换8图像块码表
图6.1 JPEG编码基本系统模型
原始图像数据输入编码器之前,首先将图像划分为8x8的图像子块,对每一子块进行离散余弦变换。量化器所需的专用数据表由下方输入,熵编码器所需的专用数据表也由下方输入。输入解码器的数据中,除了压缩图像数据外,还包含重建图像所必须的专用数据表等数据,经过熵解码器、去量化器和反DCT变换后,得到重建的图像数据。 (二)JPEG 压缩简介 1. 色彩模型
JPEG 的图片使用的是 YUV(亮度色度) 颜色模型。 YUV 模型更适合图形压缩。 因为人眼对图片上的亮度 Y 的变化远比色度的变化敏感。所以,可以将RGB 模型转换为YUV模型,转换公式如下:
(1)[R G B] -> [Y U V]转换
Y = 0.298*R + 0.588*G + 0.114*B (亮度)
15
U = -0.733 *(B-Y)+127 V = 0.927 *(R-Y)+127
(2) [Y U V] -> [R G B] 转换
R = Y + 1.0787 *(V-127)
G = Y - 0.2645*(U-127) – 0.5467*( V-127) B = Y + 1.3642 *(U-127) 2. 离散余弦变换(DCT)
将源图像f(x,y)顺序分割成8×8的子图像块并进行二维离散余弦变换:
771(2x?1)u?(2y?1)v?F(u,v)?C(u)C(v)[??f(x,y)coscos]
41616x?0y?0?1/2其中C(u),C(v)???1个交流(AC)系数。
当u,v?0 其它变换的结果是在U、V空间上得到64个变换系数,包括一个直流(DC)系数F(0,0)和63
另外,在进行DCT变换以前,二维空间图像亮度数据通常较高,应该先进行向下的电平移位,例如,用8位量化像素取样值时,电平移位值取28-1=128,即最大值28之半。
3.系数量化
量化的目的是把F(u,v)变换系数从一个数值范围转化到另一个数值范围,减少DCT系数的幅值和增加0的个数。具体方法是用量化表除DCT系数,量化表分亮度和色度两种,如表1、表2所示。
表1:亮度分量用量化表 表2:色度分量用量化表
16 11 10 16 24 2 12 14 19 26 14 13 16 24 40 14 17 22 29 51 18 22 37 56 68 24 35 55 64 81 40 58 57 87 51 60 69 80 61 55 56 62 17 18 24 47 99 99 99 99 18 21 26 66 99 99 99 99 24 26 56 99 99 99 99 99 47 66 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 109 103 77 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99
设上述表中的数值为Q(u,v),也称为量化步长。
量化表是控制JPEG 压缩比的关键,量化过程即用量化表除DCT系数,所得的值用四舍五入取整数,可由下式表示:
FQ(u,v)?取整(F(u,v)/Q(u,v))
16
式中F(u,v)为DCT系数,Q(u,v)为量化步长,F(u,v)间称为量化系数。
去量化时,用量化步长乘归一化量化系数即可,可由下式表示:
Q
FQ'(u,v)?FQ(u,v)Q(u,v)
4. DCT系数“之”字扫描
经过系数量化后,为了保证将二维频域矩阵中频域系数排列成一维矢量的形式,同时要保证低频图像分量在一维排列中首先出现,通常采用“之”字扫描方式(zig zag),其扫描顺序如下:
0, 1, 5, 6,14,15,27,28, 2, 4, 7,13,16,26,29,42, 3, 8,12,17,25,30,41,43, 9,11,18,24,31,40,44,53, 10,19,23,32,39,45,52,54, 20,22,33,38,46,51,55,60, 21,34,37,47,50,56,59,61, 35,36,48,49,57,58,62,63
5.系数编码
(I)经过以上处理后我们得到一个一维数组包含64个系数,其中第一个是直流(DC)系数,即8X8空域图像子块的平均值。其余63个系数是交流(AC)系数。
(1) 直流(DC)系数编码,由于直流系数之间的相关性很强,JPEG对DC系数采用了DPCM编码,或差分编码,即对相邻块之间的DC系数的差值进行编码。 (2) JPEG对其余的63个交流(AC)系数采用了游程编码。 (II)熵编码
为了进一步压缩数据,需要对DC码字和AC游程编码的码字进行熵编码,根据情况可选用Huffman编码。熵编码可分为两步进行,首先把DC码字和游程码字转换成中间符号序列,然后给这些符号赋以变长码。
(1) 熵编码的中间格式表示
熵编码的中间格式由两个符号组成。对AC系数, 符号1 (游程,尺寸) 符号2 (幅度值)
游程长度的范围为1—15,当游程长度超过15时,用增加符号1 “(15,0)”的个数来解决。对于8X8块的63个AC系数最多增加3个“(15,0)”扩展符号1。符号2中的幅值用以表示非零AC的系数的值,其范围为[-1024~~ 1023]其符号结构见表3。
对于直流分量DC系数,也采用类似于AC系数的符号1和符号2中间格式表示。 符号1(尺寸)
17
符号2(幅度)
符号1的尺寸信息是表示DC系数差值的幅度编码所需的比特数;符号2表示差值的幅值,其范围为[-2048,2047],即用1—11比特表示。符号1、符号2的Huffman编码结构见表4。
表3 AC系数符号2的熵编码结构 表4 DC系数差值的熵编码结构
尺寸 尺寸 1 2 3 4 5 6 7 8 9 10 幅度值 -1,1 -3,-2,2,3 -7~-4, 4~7 -15~-8, 8~15 -31~-16,16~31 -63~-32,32~63 -127~-64,64~127 -255~-128,128~255 -511~-256,256~511 -1023~-512,512~1023 幅度值 0 0 1 2
3 4 5 6 7 8 9 10 11 -1,1 -3,-2,2, 3 -7~-4, 4~7 -15~-8, 8~15 -31~-16,16~31 -63~-32,32~63 -127~-64,64~127 -255~-128,128~255 -511~-256,256~511 -1023~-512,512~1023 -2047~-1024,1024~2047 (2)熵编码
下一步工作是熵编码,即将63个AC系数表示成为符号1和符号2对的序列。零游程长度超15,有多个符号1,块结束(EOB)时只有一个符号1以(0,0)表示。可变长熵编码就是针对这种符号序列进行编码。
对AC系数采用两种编码方法:一种是针对符号1进行Huffman编码,即可变长编码;另一种是对符号2,即AC系数的极性(正负)编码值进行变长编码,对每一段落(如-63—-32,32—63)中的AC系数值来说,实际上是等长编码,此时码字的长度SIZE=6。第1bit表示极性,正AC系数值第1bit为“1”,负AC系数1bit为“0”,对振幅相同极性相反的AC系数,其码字呈反码关系。用6比特表示SIZE=6段落中的AC系数值,其编码关系如下:
AC AC
32 100000 -32 011111 33 100001 -33 011110 : : : :
63 111111 -63 000000
以上这些码字,应紧接于符号1的Huffman码字之后。Huffman码表必须作为JPEG编码器的输入。JPEG推荐了两张Huffman码表,一张是针对亮度信号的,一张是针对色度信号的。
对DC系数来说,因亮度信号和色度信号的统计特性不同,所用Huffman码表也不同。
18
在Huffman码字之后要对每一段落中的差值DIFF的极性与精确的差值进行编码。如SIZE=5,差值DIFF为-31——-16,16——31,此时用5bit表示SIZE=5段落中不同的差值DIFF,5bit中第1bit表示极性,为“1”表示正值,“0”表示负值,编码关系为:
DIFF DIFF
16 10000 -16 01111 17 10001 -17 01110 18 10010 -18 01101 : : : : 31 11111 -31 00000
四、JPEG基本系统编码举例
图6.2是使用JPEG算法对一个8×8图像块计算得到的结果。进行离散余弦变换之前对源图像中的每个样本数据减去了128,在离散余弦反变换后对重构图像中的每个样本数据加了128。
图6.2 JPEG编码实例
经过量化后的系数要经过熵编码后传送到编码器。首先对DC系数进行编码,假定前一个8X8块变换DC系
数的量化值为12,则DC系数的差是+3,故其中间格式表示为(2)(3),即尺寸为2,幅度为3。
AC系数接着被编码,经过“之”字扫描,第一个非零系数是-2,其中零的个数,即游程为1。其中间格式表示为(1,2)(-2),依次类推,可求得其符号序列的中间格式,为:(2)(3), (1,2)(-2), (0,1)(-1), (0,1)(-1), (0,1)(-1), (2,1)(-1), (0,0) 接下来进行熵编码,DC系数差值可变长度编码为 (1) 011
AC系数的可变长度编码为
(0,0) 1010 ,(0,1) 00,(1,2) 11011,(2,1) 11100 而系数值的编码为(用2的补码表示) (2) 11,(-2) 01,(-1) 0
因此,该8X8子块压缩后的数据流为01111,1101101,000,000,000,111000,1010。
19