JPEG压缩编码标准样本.docx
- 文档编号:14053012
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:14
- 大小:81.73KB
JPEG压缩编码标准样本.docx
《JPEG压缩编码标准样本.docx》由会员分享,可在线阅读,更多相关《JPEG压缩编码标准样本.docx(14页珍藏版)》请在冰点文库上搜索。
JPEG压缩编码标准样本
9.4JPEG压缩编码原则
JPEG是联合图象专家组(JointPictureExpertGroup)英文缩写,是国际原则化组织(ISO)和CCITT联合制定静态图象压缩编码原则。
和相似图象质量其他惯用文献格式(如GIF,TIFF,PCX)相比,JPEG是当前静态图象中压缩比最高。
咱们给出详细数据来对比一下。
例图采用Windows95目录下Clouds.bmp,原图大小为640*480,256色。
用工具SEA(version1.3)将其分别转成24位色BMP、24位色JPEG、GIF(只能转成256色)压缩格式、24位色TIFF压缩格式、24位色TGA压缩格式。
得到文献大小(以字节为单位)分别为:
921,654,17,707,177,152,923,044,768,136。
可见JPEG比其他几种压缩比要高得多,而图象质量都差不多(JPEG解决颜色只有真彩和灰度图)。
正是由于JPEG高压缩比,使得它广泛地应用于多媒体和网络程序中,例如HTML语法中选用图象格式之一就是JPEG(另一种是GIF)。
这是显然,由于网络带宽非常宝贵,选用一种高压缩比文献格式是十分必要。
JPEG有几种模式,其中最惯用是基于DCT变换顺序型模式,又称为基线系统(Baseline),如下将针对这种格式进行讨论。
1. JPEG压缩原理
JPEG压缩原理其实上面简介那些原理综合,博采众家之长,这也正是JPEG有高压缩比因素。
其编码器流程为:
图9.3 JPEG编码器流程
解码器基本上为上述过程逆过程:
图9.4 解码器流程
8×8图象通过DCT变换后,其低频分量都集中在左上角,高频分量分布在右下角(DCT变换事实上是空间域低通滤波器)。
由于该低频分量包括了图象重要信息(如亮度),而高频与之相比,就不那么重要了,因此咱们可以忽视高频分量,从而达到压缩目。
如何将高频分量去掉,这就要用到量化,它是产生信息损失根源。
这里量化操作,就是将某一种值除以量化表中相应值。
由于量化表左上角值较小,右上角值较大,这样就起到了保持低频分量,抑制高频分量目。
JPEG使用颜色是YUV格式。
咱们提到过,Y分量代表了亮度信息,UV分量代表了色差信息。
相比而言,Y分量更重要某些。
咱们可以对Y采用细量化,对UV采用粗量化,可进一步提高压缩比。
因此上面所说量化表普通有两张,一张是针对Y;一张是针对UV。
上面讲了,通过DCT变换后,低频分量集中在左上角,其中F(0,0)(即第一行第一列元素)代表了直流(DC)系数,即8×8子块平均值,要对它单独编码。
由于两个相邻8×8子块DC系数相差很小,因此对它们采用差分编码DPCM,可以提高压缩比,也就是说对相邻子块DC系数差值进行编码。
8×8其他63个元素是交流(AC)系数,采用行程编码。
这里浮现一种问题:
这63个系数应当按照怎么样顺序排列?
为了保证低频分量先浮现,高频分量后浮现,以增长行程中持续“0”个数,这63个元素采用了“之”字型(Zig-Zag)排列办法,如图9.5所示。
图9.5 Zig-Zag
这63个AC系数行程编码码字用两个字节表达,如图9.6所示。
图9.6 行程编码
上面,咱们得到了DC码字和AC行程码字。
为了进一步提高压缩比,需要对其再进行熵编码,这里选用Huffman编码,提成两步:
(1)熵编码中间格式表达
对于AC系数,有两个符号。
符号1为行程和尺寸,即上面(RunLength,Size)。
(0,0)和(15,0)是两个比较特殊状况。
(0,0)表达块结束标志(EOB),(15,0)表达ZRL,当行程长度超过15时,用增长ZRL个数来解决,因此最多有三个ZRL(3×16+15=63)。
符号2为幅度值(Amplitude)。
对于DC系数,也有两个符号。
符号1为尺寸(Size);符号2为幅度值(Amplitude)。
(2)熵编码
对于AC系数,符号1和符号2分别进行编码。
零行程长度超过15个时,有一种符号(15,0),块结束时只有一种符号(0,0)。
对符号1进行Hufffman编码(亮度,色差Huffman码表不同)。
对符号2进行变长整数VLI编码。
举例来说:
Size=6时,Amplitude范畴是-63~-32,以及32~63,对绝对值相似,符号相反码字之间为反码关系。
因此AC系数为32码字为100000,33码字为100001,-32码字为011111,-33码字为011110。
符号2码字紧接于符号1码字之后。
对于DC系数,Y和UVHuffman码表也不同。
掉了这样半天书包,你也许已经晕了,呵呵。
举个例子来阐明上述过程就容易明白了。
下面为8×8亮度(Y)图象子块通过量化后系数。
15 0 -1 0 0 0 0 0
-2 -1 0 0 0 0 0 0
-1 -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 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
可见量化后只有左上角几种点(低频分量)不为零,这样采用行程编码就很有效。
第一步,熵编码中间格式表达:
先看DC系数。
假设前一种8×8子块DC系数量化值为12,则本块DC系数与它差为3,依照下表
Size Amplitude
0 0
1 –1,1
2 –3,-2,2,3
3 –7~-4,4~7
4 –15~-8,8~15
5 –31~-16,16~31
6 –63~-32,32~63
7 –127~-64,64~127
8 –255~-128,128~255
9 –511~-256,256~511
10 –1023~512,512~1023
11 –2047~-1024,1024~2047
查表得Size=2,Amplitude=3,因此DC中间格式为
(2)(3)。
下面对AC系数编码。
通过Zig-Zag扫描后,遇到第一种非零系数为-2,其中遇到零个数为1(即RunLength),依照下面这张AC系数表:
Size Amplitude
1 –1,1
2 –3,-2,2,3
3 –7~-4,4~7
4 –15~-8,8~15
5 –31~-16,16~31
6 –63~-32,32~63
7 –127~-64,64~127
8 –255~-128,128~255
9 –511~-256,256~511
10 –1023~512,512~1023
查表得Size=2。
因此RunLength=1,Size=2,Amplitude=3,因此AC中间格式为(1,2)(-2)。
别的点类似,可以求得这个8×8子块熵编码中间格式为
(DC)
(2)(3),(1,2)(-2),(0,1)(-1),(0,1)(-1),(0,1)(-1),(2,1)(-1),(EOB)(0,0)
第二步,熵编码:
对于
(2)(3):
2查DC亮度Huffman表得到11,3通过VLI编码为011;
对于(1,2)(-2):
(1,2)查AC亮度Huffman表得到11011,-2是2反码,为01;
对于(0,1)(-1):
(0,1)查AC亮度Huffman表得到00,-1是1反码,为0;
……
最后,这一8×8子块亮度信息压缩后数据流为11011,1101101,000,000,000,111000,1010。
总共31比特,其压缩比是64×8/31=16.5,大概每个象素用半个比特。
可以想见,压缩比和图象质量是呈反比,如下是压缩效率与图象质量之间大体关系,可以依照你需要,选取适当压缩比。
表9.1 压缩比与图象质量关系
压缩效率(单位:
bits/pixel)
图象质量
0.25~0.50
中~好,可满足某些应用
0.50~0.75
好~较好,满足多数应用
0.75~1.5
极好,满足大多数应用
1.5~2.0
与原始图象几乎同样
以上咱们简介了JPEG压缩原理,其中DC系数使用了预测编码DPCM,AC系数使用了变换编码DCT,两者都使用了熵编码Huffman,可见几乎所有老式压缩办法在这里都用到了。
这几种办法结合正是产生JPEG高压缩比因素。
顺便说一下,该原则是JPEG小组从诸各种不同中方案中比较测试得到,并非空穴来风。
上面简介了JPEG压缩基本原理,下面简介一下JPEG文献格式。
2. JPEG文献格式
JPEG文献大体上可以提成如下两个某些:
标记码(Tag)加压缩数据。
先简介标记码某些。
标记码某些给出了JPEG图象所有信息(有点类似于BMP中头信息,但要复杂多),如图象宽、高、Huffman表、量化表等等。
标记码有诸多,但绝大多数JPEG文献只包括几种。
标记码构造为:
SOI
DQT
DRI
SOF0
DHT
SOS
…
EOI
标记码由两个字节构成,高字节为0XFF,每个标记码之前可以填上个数不限填充字节0XFF。
下面简介某些惯用标记码构造及其含义。
(1)SOI(StartofImage)
标记构造 字节数
0XFF 1
0XD8 1
可作为JPEG格式判据(JFIF还需要APP0配合)
(2)APP0(Application)
标记构造 字节数 意义
0XFF 1
0XE0 1
Lp 2 APP0标记码长度,不涉及前两个字节0XFF,0XE0
Identifier5 JFIF辨认码0X4A,0X46,0X49,0X46,0X00
Version 2 JFIF版本号可为0X0101或者0X0102
Units 1 单位,等于零时表达未指定,为1表达英寸,为2表达
厘米
Xdensity 2 水平辨别率
Ydensity 2 垂直辨别率
Xthumbnail 1 水平点数
Ythumbnail 1 垂直点数
RGB0 3 RGB值
RGB1 3 RGB值
…
RGBn 3 RGB值,n=Xthumbnail*Ythumbnail
APP0是JPEG保存给Application所使用标记码,而JFIF将文献有关信息定义在此标记中。
(3)DQT(DefineQuantizationTable)
标记构造 字节数 意义
0XFF 1
0XDB 1
Lq 2 DQT标记码长度,不涉及前两个字节0XFF,0XDB
(Pq,Tq) 1 高四位Pq为量化表数据精准度,Pq=0时,Q0~Qn
值为8位,Pq=1时,Qt值为16位,Tq表达量化表
编号,为0~3。
在基本系统中,Pq=0,Tq=0~1,也就是
说最多有两个量化表。
Q0 1或2 量化表值,Pq=0时;为一种字节,Pq=1时,为两个
字节
Q1 1或2 量化表值,Pq=0时;为一种字节,Pq=1时,为两个
字节
…
Qn 1或2 量化表值,Pq=0时,为一种字节;Pq=1时,为两个
字节。
n值为0~63,表达量化表中64个值(之字形排
列)
(4)DRI(DefineRestartInterval)
此标记需要用到最小编码单元(MCU,MinimumCodingUnit)概念。
前面提到,Y分量数据重要,UV分量数据相对不重要,因此可以只取UV一某些,以增长压缩比。
当前支持JPEG格式软件普通提供两种取样方式YUV411和YUV422,其含义是YUV三个分量数据取样比例。
举例来说,如果Y取四个数据单元,即水平取样因子Hy乘以垂直取样因子Vy值为4,而U和V各取一种数据单元,即Hu×Vu=1,Hv×Vv=1。
那么这种某些取样就称为YUV411。
如图9.7所示:
图9.7 YUV411示意图
图9.8 YUV111排列顺序
易知YUV411有50%压缩比(本来有12个数据单元,当前有6个数据单元),YUV422有33%压缩比(本来有12个数据单元,当前有8个数据单元)。
那么你也许会想,YUV911,YUV1611压缩比不是更高嘛?
但是要考虑到图象质量因素。
因此JPEG原则规定了最小编码单元MCU,规定Hy×Vy+Hu×Vu+Hv×Vv≤10。
MCU中块排列方式与H,V值有密切关系,如图9.8、图9.9、图9.10所示。
图9.9 YUV211排列顺序
图9.10 YUV411排列顺序
标记构造 字节数 意义
0XFF 1
0XDD 1
Lr 2 DRI标记码长度,不涉及前两个字节0XFF,0XDD
Ri 2 重入间隔MCU个数,Ri必要是一MCU行中MCU
个数整数,最后一种零头不一定刚好是Ri个MCU。
每个重入间隔各自独立编码。
(5)SOF(StartofFrame)在基本系统中,只解决SOF0
标记构造 字节数 意义
0XFF 1
0XC0 1
Lf 2 SOF标记码长度,不涉及前两个字节0XFF,0XC0
P 1 基本系统中,为0X08
Y 2 图象高度
X 2 图象宽度
Nf 1 Frame中成分个数,普通为1或3,1代表灰度图,3
代表真彩图
C1 1 成分编号1
(H1,V1) 1 第一种水平和垂直采样因子
Tq1 1 该量化表编号
C2 1 成分编号2
(H2,V2) 1 第二个水平和垂直采样因子
Tq2 1 该量化表编号
…
Cn 1 成分编号n
(Hn,Vn) 1 第n个水平和垂直采样因子
Tqn 1 该量化表编号
(6)DHT(DefineHuffmanTable)
标记构造 字节数 意义
0XFF 1
0XC4 1
Lh 2 DHT标记码长度,不涉及前两个字节0XFF,0XC4
(Tc,Th) 1
L1 1
L2 1
…
L16 1
V1 1
V2 1
…
Vt 1
Tc为高4位,Th为低4位。
在基本系统中,Tc为0或1,为0时,指DC所用Huffman表,为1时,指AC所用Huffman表。
Th表达Huffman表编号,在基本系统中,其值为0或1。
因此,在基本系统中,最多有4个Huffman表,如下所示:
Tc Th Huffman表编号(2×Tc+Th)
0 0
1 1
0 2
1 1 3
Ln表达每个n比特Huffman码字个数,n=1~16
Vt表达每个Huffman码字所相应值,也就是咱们前面所讲符号1,对DC来说该值为(Size),对AC来说该值为(RunLength,Size)。
t=L1+L2+…L16
(7)SOS(StartofScan)
标记构造 字节数 意义
0XFF 1
0XDA 1
Ls 2 DHT标记码长度,不涉及前两个字节0XFF,0XDA
Ns 1
Cs1 1
(Td1,Ta1) 1
Cs2 1
(Td2,Ta2) 1
…
CsNs 1
(TdNs,TaNs) 1
Ss 1
Se 1
(Ah,Al)1
Ns为Scan中成分个数,在基本系统中,Ns=Nf(Frame中成分个数)。
CSNs为在Scan中成分编号。
TdNs为高4位,TaNs为低4位,分别表达DC和AC编码表编号。
在基本系统中Ss=0,Se=63,Ah=0,Al=0。
(8)EOI(EndofImage) 结束标志
标记构造 字节数 意义
0XFF 1
0XD9 1
3. JPEG基本系统解码器实现
笔者曾经实现了一种Windows下JPEG基本系统解码器,限于篇幅,这里就不给源程序了,只给出大体上程序流程图(见图9.11)。
图9.11 JPEG解码器程序流程图
图9.12 程序运营时画面
由于没有用到什么优化算法,该解码器速度并不高,在用VC性能评测工具Profile评测该程序时我发现最耗时地方是反离散余弦变换(IDCT)那里,其实这是显然,浮点数指令条数要比整数多得多,因而采用一种迅速IDCT算法能很大提高性能,我这里采用是当前被以为比较好一种迅速IDCT算法,其重要思想是把二维IDCT分解成行和列两个一维IDCT。
图9.12是程序运营时画面。
源程序参见本书所附软盘
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JPEG 压缩 编码 标准 样本