姓名:李伟 学号:17101223393
【嵌牛导读】:大家对JPEG了解吗?今天和大家分享一下。
【嵌牛鼻子】:DCT 变换、图像压缩。
【嵌牛提问】:JPEG变换的计算过程
【嵌牛正文】:
JPEG 是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。人们日常碰到的“.jpeg”、‘’.jpg“等指代的是图像数据经压缩编码后在媒体上的封存形式,不能与JPEG压缩标准混为一谈。
JPEG编解码器
下图为JPEG基本系统的编解码器原理图,输入的彩色图像为Y、U、V三个分量,JPEG对它们分别进行编码。
压缩步骤
由于JPEG的有损压缩方式(Lossy mode of operation)并不比其他的压缩方法更优秀,
因此我们着重来看它的有损压缩中最常用的基线JPEG算法(baseline sequential)。以一幅24位彩色图像为例,JPEG的压缩步骤分为:
1.颜色转换
JPEG支持图像采用任何一个色彩空间,支持1~4个颜色分量。灰度图像颜色分量数为1。RGB、YUV、YCbCr等拥有3种颜色分量。4种颜色分量的例子是青、洋红、黄和黑(Cyan,Magenta,Yellow,and Black,CMYK)。为了减少色度通道包含的大量的冗余信息,本例中采用YCbCr色彩空间。首先需要进行从RGB到YCbCr的色彩空间变换:
Y = 0.299000R + 0.587000G + 0.114000B
Cb = -0.168736R - 0.331264G + 0.500002B
Cr = 0.500000R - 0.418688G - 0.081312B
其中,Y表示亮度分量,Cb和Cr表示蓝红色度分量。
2.DC电平偏移
最初,在图像中的像素存储在无符号的整数中。对于数学计算,在图像中任何变换或数学计算开始之前,根本上是将这些采样转换成两个补码表示。DC电平偏移的目的是保证输入图像的采样有近似地集中在零附近的动态范围。DC电平偏移执行的图像采样只通过无符号数表示。
方法:假设图片分量的采样精度为n,那么分量中的每个像素值应减去2的(n-1)次幂。
对于图像而言他的采样由无符号的整数表示,例如CT(X光断层成像)图像,动态范围已经集中于零附近,所以不需要DC电平偏移。
3.子采样
色彩空间转换之后,图像的大多数空间信息包含在亮度分量Y中。色度分量Cb和Cr包含大量冗余的颜色信息,所以我们运用子采样较少色度数据量以在丢失少量信息的情况下压缩图像。
基线JPEG常用的子采样格式为4:2:0,同时支持4:2:2和4:4:4颜色格式。
4.DCT变换
DCT(DiscreteCosineTransform)是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程。然后再对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。首先将图像划分为多个8*8的矩阵。然后对每一个矩阵作DCT变换。变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。
标准色度量化表
标准亮度量化表
5.量化
由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图像矩阵之间有了差异,这一差异是造成图像失真后失真的主要原因。
量化算法
在这一过程中,质量因子的选取至为重要。值选得过大,可以大幅度提高压缩比,但是图像质量就比较差;反之,质量因子越小(最小为1),图像重建质量越好,但是压缩比越低。对此,ISO已经制定了一组供JPEG代码实现者使用的标准量化值(如右图所示)。
右图的两个量化表的设计是根据由Lohscheller做的心理视觉实验来确定二维基函数的可见阈值。
这些表也不适用于各种各样的图像,但他们为大多8位精度自然图像进行亮度和色度采样提供了合理的、出色的结果。
6.编码
从前面过程我们可以看到,颜色转换完成到编码之前,图像并没有得到进一步的压缩,DCT变换和量化可以说是为编码阶段做准备。
编码采用两种机制:一是0值的行程长度编码;二是熵编码(EntropyCoding)。
zig_zag
①之字形排序(Zig-zag ordering)
在JPEG中,采用曲徊序列,即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。
②使用RLE对交流系数(AC)进行编码
行程长度编码是非常简单和常用的编码方式,在此不再赘述。
需要注意的是,AC系数的之字形序列编码中有两个特殊符号——(0,0)和(15,0)。第一个特殊符号指的是块的结束(end-of-block,EOB),用来表明在之字形块中剩余的元素都是零。另一个特殊符号是指零游程长度(zero-run-length,ZRL),用来表明16个零游程。基线JPEG允许的零游程最大长度是16个。如果这里的零超过16个,那么这个游程分成几个长度为16的零游程。
③使用DPCM对直流系数(DC)进行编码
DCT系数量化之后,通过差分编码对量化后的DC系数编码。当前块的DC系数减去前个块的DC系数,然后对其差值进行编码,如右图所示。这就利用了邻接块DC值之间的空间相关性。
④熵编码
编码实际上是一种基于统计特性的编码方法。在JPEG中允许采用HUFFMAN编码或者算数编码。而基线JPEG算法(baseline sequential)采用的是前者。
经过RLE编码的AC系数可以映射成两个标志(RUNLENGTH,CATEGORY)和(AMPLITUDE),前者采用的是霍夫曼编码,而后者采用的是VLI编码。同理经过DPCM编码的DC系数同样可以映射成两个标志(CATEGORY)和(AMPLITUDE),,前者采用霍夫曼编码,后者采用VLI编码。
基线JPEG允许使用4个霍夫曼表,两个用于AC系数编码,两个用于DC系数编码。具体的编码表请查询ITU-T.81的表K.3~K.6
数据压缩格式
1.JPEG定义了三种压缩数据格式:
a) 交换格式 (interchange format)
b) 压缩图像数据的缩略格式(abbreviated format for compressed image data,)
c) 规范表数据的缩略格式(abbreviated format for table-specification data)
2.压缩数据规范的基本内容(General aspects of the compressed data formatspecifications)
在结构上,压缩数据格式包含一个由参数、标志和熵编码数据段组成的有序集合。参数和标记往往又形成标志段。由于所有这些组成部分是由字节对齐的代码表示的,因此每一个压缩数据格式由一个8-bits字节的有序序列组成。对于每一个字节,都定义了一个最高有效位(MSB)和一个最低有效位(LSB)。[4]
插图的语法规定示例
3.插图的语法规定(Conventions for syntax figures)
如右图:
为了便于了解JPEG压缩数据流中每一个frame和scan的内容,必须掌握以下语法
– 参数/标记指示符:一个细线框包含一个标志或一个单独的参数;
– 段指示符:一个粗线框包含一个标志段、一个熵编码段或他们的结合;
– 参数长度指示符:细线框的宽度与其包含的参数或标志的位长成正比(如图B.1中的E(4位),B(8位)和D(16位)所示)。相反,粗线框的宽度是无意义的;
– 可选的/有条件的指示符:方括号标明,在压缩数据中,当前标志段或标记只是可选的或有条件的。
– 次序:交换格式中,图中所示的参数或标志都先于其右边所示的参数或标志,并跟在它左边的参数后面。
– 熵编码数据指示符:尖括号标明,其包围的内容是已经经过了熵编码的。