开发者学堂课程【高校精品课-华中科技大学 -智能媒体计算:JPEG(上)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/811/detail/15688
JPEG(上)
内容介绍:
一. JPEG 压缩思想
二. JPEG 压缩算法步骤
今天的主要内容是 JPEG 压缩标准,JPEG 是一种图像的压缩标准,跟大家的生活息息相关,手机中的照片基本上全是 jpg 格式,也就是 JPEG 压缩标准形成的文件。
一. JPEG 压缩思想
JPEG 是 Joint Photographic Experts Group 首字母的缩写,字面解释就是联合图像专家组,其中联合是指国际电子学委员会(IEC)和国际标准化协会(ISO)这两个组织联合成立了一个专家小组,这个小组联合公关要设计一个标准让图像质量不降低但是数据量要减少。
JPEG 标准是连续色度、多级灰度、静止图像的数字图像压缩标准,也是适用范围非常广的通用的标准,比如静止图像压缩、电视序列图像中的帧内图像压缩,因为电视序列中是由若干个图像按照一定频率播放所形成的视频文件。JPEG 专家组开发了两种基本的压缩算法,一个是以 DCT 为基础的有损压缩算法,另一种以预测技术为基础的无损压缩,有损通常剔除视觉上的冗余,有损重点是去掉数据本身存在的冗余。
压缩的主要思想一个是滤掉一个图像的高频信息来减少数据量。因为低频信息在定义一个图像特性方面贡献更大,丢失一些高频信息会丢失一些图像的细节,因此对图像的影响不大,在压缩时并不是把高频全部丢失,而是对高频信息描述的精度降低,因此影响是有限的。
JPEG 利用人的视觉特性,使用量化和无损压缩相结合去掉视觉的冗余。视觉的冗余是通过量化去掉的,敏感的用多的位数描述,不敏感的用少的位数。低频部分是敏感的,高频部分是不敏感的,前面加一个 DCT 变换由此知道哪些是高频哪些是低频,DCT 变换把原始的时域、空域信号变成了特定的系数,比如8×8变成64个系数。低频部分一个是直流分量,这是最重要的,剩下的交流分量中也有低频到高频的,通过 DCT 变换把低频和高频分出来了。
量化的时候有针对性的针对特定的频率采用不同的量化步长,从而去除视觉冗余。
数据本身的冗余通过预测编码比如相邻的相关做一个差就变小了,根据统计特性用哈夫曼编码、算术编码或者形成长度编码,这是 JPEG 压缩思想。
二. JPEG 压缩算法步骤
编码的步骤把一个图像分解成若干个8×8的块,然后对它实施正向的 DCT 变换,然后对变换之后的系数进行量化。不同频率的采用不同的步长,步长存在量化表中,比如8×8的块变换成64个系数,那么量化表也是8×8的,也就是说量化表和系数一一对应,查表然后做除法即可。量化以后产生的量化的值再进行熵编码,然后组成压缩的图像数据表。
解压缩的过程是相反的,先进行熵解码,用的什么编码器就用反向的解码器。
然后再进行逆量化,对量化表做乘法,最后进行 DCT 的逆变换,最后把8×8的图像拼在一起就还原了原始的图像。详细的步骤列一下,第一步就是使用正向的离散的 DCT 变换(FDCT),把图像从空间域变换到频率域。第二步使用加权函数对 DCT 进行量化。这个加权函数是根据人的视觉特性形成的,根据加权函数设计出量化表。第三步是 Z 字型编码(zigzag scan),为了0的个数尽可能多。第四步使用差分脉冲编码调制(DPCM)是一种预测的差分编码对直流系数 DC 进行编码。第五步使用行程编码(RLE)对交流系数 AC 进行编码。第六步熵编码,对前五步得到的结果使用哈夫曼编码再进行编码。最后一步组成数据流。解码的过程与上面的七步相反。
第一步离散的余弦编码,采用8×8大小的二维的 DCT,空域变换到频率域。8×8数据块输入之后分解成64个正交的信号,每个正交的基信号对应了64个独立的二维空间频率中的一个,这些频率空间由输入信号的频谱组成。FDCT 的输出64个基信号的幅值称作 DCT 系数,DCT 系数中有一个代表直流分量叫 DC 系数,其他63个代表交流系数叫 AC 系数。
直流系数在左上角一个 F(0,0),其他的都是交流系数。逆变换跟正变换是相反的,把64个系数经过量化运算重建64个点,如果使用设备的计算精度足够高,且这些系数未经过量化,可以精确的还原。不能完全精确的还原是因为进行了量化,量化产生了误差。
为了达到压缩的目的,对 DCT 变换的F(u,v) 系数进行量化,量化处理是造成 DCT 编码主要的信息损失的根源,因为量化要进行四舍五入。不同频率的余弦波对视觉影响不同,可根据不同的视觉阈值选择量化表中元素值的大小。
量化表中的值实际是步长,步长的分母越大,将来得到的结果越小,产生的误差可能就越大。通过心理的视觉实验可以确定不同频率的视觉阈值,从而确定不同频率的量化步长。
上图中左边是亮度量化表,右边是色度量化表,位于左上角的值是17和16,值都相对要小,越与左上角接近,值就越小,左上角的值对应的是直流分量,其他的是交流分量的量化。越往左上角频率越低,值就相对要小,量化步长小,相反频率越高的部分,量化步长就大,这是一个非线性的变化。
量化步长大,描述的就不够精确,因为高频部分不敏感,可以粗糙一点,这就是压缩数据的根源。而量化表中的值,取值的变化影响了 JPEG 图像的压缩比,比如系数都减半,商的值就提高了一倍,所以调 JPEG 的压缩比实际就是调的主要的就是量化表。
量化之后进行 Z 字型编码,为了使连续0的个数尽可能多,编排方法按照 Z 字型的样式排。
8×8的块相邻的像素之间是相关的,也就是粉色周围的点离它越近越相关,如果不用 Z 字型编码,用水平排列,最后一位像素跟前面越远相关性越差,反过来编因为不相关连续0的可能性就小,后面由于不相关就变成不是0了。
而采用 Z 字型编码,使两两都是接近的,这样排使得彼此都是相关的。
这就是编排的顺序,这是第0个像素,第0个元素排完之后是1,1之后是2,编排产生若干0之后可以形成长度编码。
第四步直流系数编码,DC 系数有两个特点,一个是系数值比较大,第二个是相邻图像块 DC 系数很接近,变化不大。一个很大的值,相邻的变化又不大,大家自然想应该用差分脉冲编码调制这种预测技术,对两个相邻的块求差,对△值进行编码。
第五步交流系数的编码,量化后 AC 系数的特点是1×63个矢量中通过 Z 字型编码之后会产生很多0,而且许多0是连续的,这时使用非常简单和直观的行程编码 RLE 进行编码。JPEG 使用了一个字节的高4位表示连续0的个数,使用低4位表示下一个非0系数所需要的位数,然后后面接的是非0的系数实际的值。
字节的前4位表示两个非0值之间连续0的个数,中间表示下一个非0值所需要的位数,这个所需要的位数决定了后面留多少位来存储这个非0数的值,这就是 RLE 编码。
第六步熵编码,对 DPCM 编码后的直流系数和 RLE 编码后的交流系数进一步进行压缩。比如使用哈夫曼编码或者算术编码进行压缩。频率高的分配短码字,频率越低码字就越长,这是哈夫曼编码可编程编码的思想。
最后一步把编码之后的数据组成一个位数据流,这是压缩标准标准化的部分,也就是说文件中哪一块是存什么的,是用标准规定好的,只有规定了位数据流才可以使解码成为标准。
把各种标记代码和编码后的图像数据组成一帧一帧的数据,目的是便于传输、存储和译码,这样组织之后的数据叫做位数据流(JPEG bitstream),至此完成了 JPEG 的压缩。





