小编教你科普:关于图像格式JPG和JPEG你知多少( 二 )


JPEG正是利用了人眼的这一特性 , 在压缩图像时 , 将亮度和颜色分开处理 。

小编教你科普:关于图像格式JPG和JPEG你知多少


由于人眼对亮度很敏感 , 所以JPEG不会对亮度做太多改变 , 而人眼对颜色不甚敏感(科学研究表明 , 人眼大概可以区分出1000万种不同的颜色 , 这种感知能力相比于电脑 , 就没那么精确了) , 所以在人眼开始察觉色彩不对了之前 , JPEG对颜色进行压缩处理 , 这样就算图像损失了部分细节 , 人眼也不太容易捕捉得到 。
JPEG在压缩图像时所进行的色彩空间转换 , 指的就是将RGB转换为YCbCr 。
四、缩减取样
在YCbCr模型中 , Cb通道和Cr通道中所包含的信息量远远少于Y通道中包含的信息量 , 同时 , 人眼对色彩的敏感程度有限 , 因此 , JPEG的压缩算法主要对Cb和Cr通道中的数据进行缩减取样 , 取样的比例可以是4:4:4(无缩减取样)、4:2:2(在水平方向2的倍数中取样)和4:2:0(在水平方向和垂直方向的2的倍数中取样) , 其中 , 以4:2:0最为常见 。
五、离散余弦变换(DCT)
通常我们认为 , 在8*8像素的一块方格里 , 它里面的像素往往非常相似 , 因此 , 当进行到这一步时 , JPEG会将图像分为一个又一个的8*8的像素块 。
小编教你科普:关于图像格式JPG和JPEG你知多少


一个8*8的像素块 , 图片来自维基百科
每一个像素块都利用离散余弦变换来编码 , 法国数学家傅里叶告诉我们 , 几乎所有的周期函数 , 都可以用一系列的“弦波”来表示 , 也就是说 , 靠着带权重的一系列不同余弦值的相加 , 就可以重构出我们的原图 。最后 , 每个8*8的像素块都会通过特定的函数 , 来生成一个新的8*8的数字矩阵 。
小编教你科普:关于图像格式JPG和JPEG你知多少


一个8*8的数字矩阵 , 图片来自维基百科
六、量化
事情到这里还没算完 , 通过离散余弦变换所得到的数字可不能被直接压缩 , 他们还需要再处理一下 , 这就是量化 。
量化的过程 , 实际上就是对DTC系数的一个优化过程 , 在一个8*8像素的区域中 , 每个像素点间的差异都很大时 , 它的弦波频率就很高 , 我们称之为高频区 , 相反地 , 一个8*8像素的区域中 , 每个像素点间的差异很小 , 那它的弦波频率就很低 , 我们称之为低频区 , 刚刚的DCT算法已经把哪里频率高、哪里频率低给整理出来了 。
小编教你科普:关于图像格式JPG和JPEG你知多少


越接近左上 , 频率越低 , 越接近右下 , 频率越高 。
人眼对高频区(小范围、高复杂度)的辨识能力较差 , 而对低频区(大范围、低复杂度)的辨识能力较好 , 因此JPEG就根据人眼的这一特征将高频区进行大幅的简化和压缩 , 量化的过程 , 实际上就是把频率领域上的每个成分 , 除以一个特定的常数 , 然后将计算结果四舍五入 , 取一个整数 , JPEG会将高频区的成分通过算法 , 使其接近于0 , 然后四舍五入 , 取该成分的值为0 , 最后 , 我们大概会得到这样一个矩阵:
小编教你科普:关于图像格式JPG和JPEG你知多少


图片来源:维基百科
可以看到 , 这个矩阵中有很多连续的0 , 这就对压缩非常有利了 。
七、熵编码
终于到了最后一步了 , 那就是压缩 , 仔细观察刚刚得到的最终的矩阵 , 可以看到 , 从左上角到右下角 , 连续的0的数量急剧上升 , 这种情况就要用熵编码技术 , 对数据进行编码 。
JPEG从左上角开始 , 以Z字形来回穿梭 , 直至经历了矩阵中的所有数字 , 到达右下角 。