背景
JPEG是一种有损压缩技术,在保证视觉效果差别不大的情况下,压缩比可以达到几十倍。它的原理是去除图像中一些不重要的部分,从而用更小的体积保存。一个形象的例子就是“四舍五入”,比如“2.1000000001”,保存为“2.1”,就去掉了“0.0000001”,保留了重要部分做原数字的近似。
图像分割
首先将RBG图像转换为YUV(亮度-色差)图像,这是因为人的视觉系统对亮度变化最为敏感,YUV图像可以把亮度channel单独剥离进行处理,更适合图像压缩场景。如图是一幅彩色图像的YUV分量,从中可以看到Y通道携带了图像的大部分细节信息 接着将图像分割成$8\ast 8$的小块,用于后续$DCT$变换的单独处理。
DCT离散余弦变换
DCT可以将图像以频域的形式进行表达,经过DCT变换,图像左上角会集中低频部分的能量,右下角集中高频,数值越大,代表此处的能量越多。下图是某前辈对Lena图的第一个$8\ast 8$小块进行DCT变换的结果。
量化
到目前为止依然是无损的,由于人眼对高频不敏感的特性,我们试图过滤这些右下角的高频分量,此时就要用到量化。说白了就是分别scale,把左上角的除一个较小值,右下角的除一个较大值,接着对结果进行取整,这样就会导致右下脚大部分变为0,非常有利于后面的压缩。 但量化时候并不是随便scale,经过长期的经验,人们得到了上面两张量化表,对应位置相除即可(在量化表上乘一个系数,可以得到不同的压缩比)。量化后的结果如下,右下角已大部分为0。
接着将上述矩阵按Z形编码,得到一个一维数组:
Eg:35,7,0,0,0,-6,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,…,0
,目的是尽可能使0分布在一起。接着主要对非0部分进行编码:采用JPEG提供的标准码表,及霍夫曼编码(无损),得到最终的压缩数据。
小结
JPEG编码流程:图像色彩空间变换——DCT——量化(有损)——霍夫曼编码
解码流程:霍夫曼编码恢复——反量化——IDCT——重建图