JPEG压缩学习及其C语言实现笔记
JPEG压缩流程
1.颜色转换(RGB->YUV)
2.DCT变换 (分块8*8进行DCT变换)
3.量化(-996, 19, 0, 2,0, 0, 0, 0…)
4.编码 (游程编码,哈夫曼编码)
DCT变换(离散余弦变换)空间域到频率域的变换
“变换”的基本思想是,找一组基,让图像在这组基下能量集中(少量系数值较大,其余系数接近于0)。为了达到分离能量的目的,“变换”一般应是正交的。变换必须是可逆的(否则无法解码),因此变换本身不能压缩信息。不过随后的“量化”步骤将影响不大的系数略去,即可达到压缩的目的。
适合图像压缩的变换有很多种,如Karhunen-Loeve变换(KLT,即主成分分析)、离散傅立叶变换(DFT)、离散余弦变换(DCT)、Walsh-Hadamard变换(WHT)等。
JPEG采用8x8的2-D DCT作为其核心,该变换的定义是:
其中当u,v=0时,C(u),C(v)=1/root(2),否则C(u),C(v)=1。
在计算DCT之前,要把输入图像的像素值减去128,让它的取值范围从[0,255]移到[-128,127]。
每个8x8的分块经过DCT运算得到64个系数。其中,F(0,0)称为直流系数,其余的63个系数称为交流系数。在典型的连续色调图像中,相邻像素之间的差别往往不大。这意味着空间频率的幅值集中在低频部分。对典型的8x8图像分块而言,大多数空间频率的幅值是0或者接近于0,在编码时可以忽略。DCT本身并不会降低图像的质量,最多由于整数运算的舍入误差导致重构的图像与原始图像略有差别。
如果直接采用前面的公式进行计算,则每个DCT系数F(u,v)需要64次乘法,计算全部64个DCT系数则需要64x64=4096次乘法。计算DCT是整个JPEG压缩过程中最耗时的一步,很多人研究快速算法,也有人往CPU增加新指令,使之便于DCT运算。基本思路是把2-D DCT分解为1-D DCT,再利用余弦函数的对称性来减少计算量。每个分块的计算复杂度为O(1)。对于NxM的图像,共有[N/8]x[M/8]个分块,因此,DCT这一步的计算复杂度为O(MxN)。
系数量化
量化(quantization)是JPEG压缩过程中唯一会大幅损失信息的步骤。64个DCT系数会用8x8的量化表进行均匀量化,量化表中的每个元素是1到255之间的整数,表示对应的DCT系数的量化步长。量化的作用在于降低DCT系数的精度,从而达到更好的压缩率。量化是多对一映射,因此是有损的,它是基于变换的编码器中导致信息损失的主要步骤,也是用户唯一能参与控制压缩质量的步骤。
量化的过程是将每个DCT系数除以对应的量化步长,并四舍五入为整数:
反量化(dequantization)是把量化后的系数乘以对应的量化步长:
量化表理论上应该根据输入图像确定,目标是在基本不影响图像的视觉效果的前提下,尽量提高压缩率。量化步长越大,压缩率越大,图像质量越低。JPEG标准的正文中并没有规定或推荐使用哪个量化表,不过在Annex K中有一份量化表的例子(如下图所示),适用于大多数中等质量的图片。对于超高质量和超低质量的图片,这份量化表不是最优的。通常亮度分量和色差分量各有一张量化表,而且对色差分量的将忽略更多的高频成份。实际的JPEG实现都采用这一份量化表,因此后的数据中无须包含量化表。如果把下表中的量化步长除以2,那么图像质量就接近完美了。
每个分块有64个系数需要量化,需用64次除法和取整操作,因此每个分块的计算复杂度为O(1)。对于NxM的图像,共有[N/8]x[M/8]个分块,因此量化这一步的计算复杂度为O(MxN)。
Hoffman编码
JPEG文件的格式及组织形式
参见JPEG标准的 Annex BCompressed data formats
JPEG是JointPhotographic Experts Group 的缩写,正是这个专家组制定了JPEG标准以及其他静态图片编解码标准。Joint(联合)是指ISO TC97 WG8(计算机与信息处理技术委员会第8工作组)和CCITT SGVIII两个工作组的联合. 这个专家组在1992年颁布了第一个JPEG标准, ITU在1992年命名为ITU-T Recommendation T.81, ISO/IEC在1994年命名为10918-1
注意JPEG标准仅仅说明定义了codec部分, 也就是图片如何压缩为字节流以及重新解码为图片的过程. 标准没有涉及到文件的存储格式.
JPEG标准的附录B定义了文件格式"JPEG Interchage Format"(JIF), 不过这个文件格式很少被用到, 主要是因为Encoders和Decoders完整实现JIF很困难, 此外这个标准还缺少以下几个方面:
- Color space定义
- Component sub-sampling 限制
- 像素宽高比
因此其他的JPEG文件格式标准陆续出现了.1992年颁布了JPEG FileInterchange Format(JFIF),紧接着出现了Exchange imagefile format(Exif)和ICC color profiles. 这些格式都符合JIF的字节layout,但是又增加了一些不同的markers.在某种程度上说,JFIF是JIF标准的精简版本.
Exif JPEG文件格式主要用在摄像设备上,摄像产业把Exif作为行业的元数据交换格式.由于Exif标准不支持color profiles,所以大部分软件图像编辑软件使用JFIF格式存储JPEG码流.
不论是Exif还是JFIF格式,都遵守JPEG interchangeformat(JIF),他们都是由JPEG marker和compressed data组成的.下面列出了JPEG的所有marker
表1 JPEG 的marker