深入理解JPEG
ISO/IEC 10918-1标准定义了三种压缩模式:顺序DCT、逐行扫描DCT和逐列扫描DCT,每种模式下均有多个可选的压缩比。标准还定义了几个可选的基于区块的压缩模式和编码方案,如渐进扫描和多扫描。ISO/IEC 10918-1可以存储所支持的所有压缩模式的图像数据,并根据实际需要进行解码和显示。
-
顺序DCT模式:顺序DCT模式包括 Baseline Sequential DCT Mode (Baseline)、Extended Sequential DCT Mode (Extended Baseline)和Spectral Selection Processing (Progressive DCT Mode)三种压缩模式。其中Baseline模式是最常用的压缩模式,包含对图像的一次单遍扫描,从图像的左上角到右下角进行扫描。Extended Baseline模式是Baseline模式的扩展,采用更复杂的算法来进行图像压缩。Spectral Selection Processing 是一种渐进式压缩模式,图像数据按照 DCT 系数高到低的顺序排序。
-
逐行扫描DCT模式:逐行扫描DCT模式仅支持一种渐进式压缩模式,即Progressive DCT Mode。在这个模式下,JPEG图像被分成多个扫描线,每个数据组按照 DCT 系数高到低的顺序排序。每个扫描线被分割成多个数据段,被分为多次扫描和压缩。
-
逐列扫描DCT模式:逐列扫描DCT模式也仅支持Progressive DCT Mode。它将JPEG图像按列分割成若干数据段,按照 DCT 系数从高到低的顺序排序。每个数据段被分为多次扫描和压缩。
除了以上三种压缩模式,ISO/IEC 10918-1还定义了多扫描渐进式压缩、分层压缩、可逆压缩(Lossless compression)等可选的压缩模式和编码方案。这些模式和编码方案提供了更多的压缩选项和更高的压缩率,但一般需要更多的时间进行图像压缩和解压缩。
实现这三种压缩模式的JPEG开源库有很多。下面是其中几种常见的库:
-
libjpeg:它是最经典和广泛使用的JPEG库之一,是用 C 语言实现的,支持ISO/IEC 10918-1中定义的三种压缩模式。libjpeg的设计十分简洁,有效地利用了DCT及哈夫曼编码算法,可以在不占用太多内存的情况下实现高效的压缩和解压缩。libjpeg是一种基于MIT许可证的自由软件,可以在不受限制的情况下使用。
-
TurboJPEG:它是一种高性能的JPEG库,由libjpeg-turbo项目开发,是libjpeg的改进版。TurboJPEG支持ISO/IEC 10918-1中定义的三种压缩模式,还提供了多线程支持、位图压缩,以及基于SSIM算法的图像质量评估等高级功能。TurboJPEG是一种自由软件,授权方式是3条款BSD许可证。
-
MozJPEG:它是Mozilla开发的一种JPEG优化库,是多种JPEG开源库的集成和改进。MozJPEG支持ISO/IEC 10918-1中定义的三种压缩模式,而且基于适应性量化、(AQ) 差异、颜色转换等算法进行了优化和改进,可以在尽可能减小压缩体积的前提下保持图像质量。MozJPEG是一种自由软件,授权方式是3条款BSD许可证。
ITU-R BT.601(也称为Rec. 601):这个标准定义了标准分辨率视频的色彩空间转换方法,尤其适用于SD(Standard Definition)视频。BT.601将RGB色彩空间转换为YUV色彩空间。具体的转换公式如下:
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
BT.601使用固定的量化表来对Y、U、V分量进行量化,并定义了特定的色度子采样比例。
ITU-R BT.709(也称为Rec. 709):这个标准定义了高清(High Definition)和全高清(Full High Definition)视频的色彩空间转换方法。BT.709将RGB色彩空间转换为YCbCr色彩空间。具体的转换公式如下:
Y = 0.2126R + 0.7152G + 0.0722B
Cb = -0.1146R - 0.3854G + 0.5000B
Cr = 0.5000R - 0.4542G - 0.0458B
BT.709同样使用固定的量化表来对Y、Cb、Cr分量进行量化,并定义了特定的色度子采样比例。