介绍一种谷歌开源的新的 JPEG 图片压缩算法,以及和 libjpeg/webP/sharpP 的对比。

结论要点

  • 效果:Guetzli 算法可在图片质量不变的情况下,将 JPEG 文件大小降低35%.
  • 原理:聚焦 JPEG 压缩算法流程的量化阶段;利用 Butteraugli 图像差异算法确定应该保留和丢弃哪些颜色和细节。
  • 优势:相比 webP/sharpP,优势在于压缩后仍为标准 JPG 格式,无兼容问题;相比libjpeg,优势在于相同质量系数下,压缩率更低。
  • 劣势:编码耗资源、时间长。

JPEG 压缩算法简介

这篇文章详细阐述了 JPEG 图像的压缩算法,基本系统的JPEG压缩编码算法一共分为11个步骤。为方便理解,这11个步骤又可以简化为三个过程:色彩空间变换——离散余弦变换——量化阶段
前两个过程将图像数据转换为 DCT 频率系数,有些复杂,但不是该技术的核心。可以理解为在前两项技术压缩大小已经固定的情况下,优化最后一项量化阶段。而量化阶段的操作有点类似很多图像处理软件的“另存为”:选择的视觉质量越小,它就损失越多,图片就会被压缩越小。但这个量化阶段的重点是如何取舍图像质量和图像大小这些细节问题。

Guetzli 原理

量化阶段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。
下图是常用 JPEG 的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的。我们也可以自定义量化表。量化表是控制 JPEG 压缩比的关键,这个步骤除掉了一些高频量, 损失了很多细节信息。但事实上人眼对高频信号的敏感度远没有低频信号那么敏感。所以处理后的视觉损失很小,压缩方案的优化方向是在一定程度上得到相对清晰的图像和更高的压缩率


Guetzli算法就是在这个步骤引入了一个叫做 Butteraugli 的精神视觉模型——它用来决定保存哪些颜色或者细节、压缩掉哪些细节,从而达到人们视觉上的最优,且图像文件更小。
这个模型如何以一种更全面更详细的方式来结合色彩感知和视觉掩蔽,从而在最小化损失和最小化图像尺寸中达到平衡?大致遵循如下的评价体系:

  • 人眼对强黄色光附近蓝光变化是不敏感的,因此黄光区域附近的蓝光可以用更少的bit来编码。
  • 人眼对蓝光有着较低的空间分辨率,视网膜中用于分辨高清细节的区域没有蓝色光的受体,故高频区域的蓝色光部分可以用更粗的粒度编码。
  • 将图像中的噪声区域分辨出来进行粗粒度的编码。

基于这三点,Guetzli主要从两方面下手来进行:

  • 对全局量化表进行微调,枚举很多张 JPG 的全局量化表,看哪个量化表更合适。
  • 对 DCT 系数的高频部分进行有选择的丢弃。

Guetzli 算法的一次优化大致分为三个阶段:

压缩效果肉眼观察质量


(猫眼图)左为原图,中为 libjpeg 的处理,右为 Guetzli。
第三张看起来颜色较淡;猫眼之外第三张比第二张像素块更少。

(天空中的一条电线)左为原图,中为 libjpeg 的处理,右为 Guetzli。
可以看出第二张和第三张电线均出现像素块,电线之外的天空里第三张像素块比第二张更少。

可用性

公司有部门通过比较 libjpeg, guettzli, webp 的压缩率、压缩延时、压缩资源、解压性能,对 guetilz 在线上的可用性进行了评估。根据试验结果总结表格如下:

从表格看出:

  • 相比webp, guettzli 优势在于更广的兼容性,此外网络环境越好, guettzli 解压效率越高。
  • 相比流行的 libjpeg 算法,其优势在于在压缩后图片质量表现差不多的情况下,guettzli 压缩率表现更好。
  • guettzli 最大的缺点是编码过程耗资源和时间。

  • 整体压缩效果 guetzli > libjpg(优12%-33%).
  • guetzli在高质量系数下,压缩率表现更好。