深入图像压缩算法 - DCT、小波变换与预测编码

· 9 分钟阅读

图像压缩的基本原理 - 冗余消除与信息理论

图像压缩的本质是消除数据中的冗余信息。原始图像数据包含大量冗余,通过识别和消除这些冗余可以大幅减小文件体积。

三种冗余类型:

  • 空间冗余:相邻像素之间高度相关,颜色值变化通常很小
  • 频率冗余:人眼对高频细节不敏感,可以丢弃部分高频信息
  • 编码冗余:固定长度编码未利用符号出现概率的差异

无损压缩 vs 有损压缩:

  • 无损压缩:仅消除编码冗余和空间冗余,可完全还原原始数据。PNG、GIF 采用此方式
  • 有损压缩:额外消除频率冗余 (丢弃人眼不敏感的信息),压缩率更高但不可逆。JPEG、WebP、AVIF 采用此方式

有损压缩的通用流程:

  1. 色彩空间转换 (RGB → YCbCr)
  2. 色度下采样 (利用人眼对色度分辨率低的特性)
  3. 变换编码 (DCT 或小波变换,将空间域转为频率域)
  4. 量化 (降低精度,这是信息丢失的主要步骤)
  5. 熵编码 (对量化后的系数进行无损压缩)

未压缩图像的数据量:图像压缩是去除图像数据中的冗余 (redundancy) 以减小文件体积的技术。未压缩的图像数据量极为庞大 —— 例如 4,000 × 3,000 px 的 24 位彩色图像,其数据量为 4000 x 3000 x 3 = 36MB,而经 JPEG 压缩后可降到 2-5MB 左右。

算法分类与三段式流水线:无损压缩 (Lossless) 能完整还原原始数据,如 PNG (Deflate)、WebP Lossless、JPEG-LS,压缩率约 2:1-3:1;有损压缩 (Lossy) 删除人眼无法察觉的信息以实现高压缩率,如 JPEG (DCT)、WebP Lossy (VP8)、AVIF (AV1),压缩率可达 10:1-50:1 以上。现代图像压缩的基本结构是「变换 (Transform) → 量化 (Quantization) → 熵编码 (Entropy Coding)」的 3 段流水线,各阶段分别去除不同种类的冗余。

DCT (离散余弦变换) - JPEG 的核心技术

DCT 将图像从空间域转换到频率域,是 JPEG 压缩的核心。转换后,图像的能量集中在少数低频系数上,高频系数可以被量化为零而不显著影响视觉质量。

JPEG 的 DCT 流程:

  1. 将图像分割为 8x8 像素块
  2. 对每个块进行二维 DCT 变换
  3. 得到 64 个频率系数 (左上角为 DC 系数,其余为 AC 系数)
  4. 使用量化矩阵对系数进行量化 (除以量化步长并取整)
  5. 对量化后的系数进行 Zigzag 扫描排列
  6. 使用游程编码和 Huffman 编码进行熵编码

量化矩阵的作用:

量化矩阵决定了每个频率系数的精度保留程度。低频系数 (左上角) 使用较小的量化步长以保留更多信息,高频系数 (右下角) 使用较大的步长允许更多信息丢失。JPEG 质量参数本质上是对量化矩阵的缩放。

DCT 的局限性:

  • 8x8 块边界在低质量时产生明显的块效应
  • 固定块大小无法适应图像内容的局部特性
  • 对于边缘和纹理区域,块效应尤为明显

改进方案:

JPEG 2000 使用小波变换替代 DCT 消除块效应。现代编解码器 (HEVC、AV1) 使用可变大小的变换块 (4x4 到 64x64),根据内容自适应选择最优块大小。

DCT 的定义与二维公式:DCT (Discrete Cosine Transform) 是 JPEG 压缩的核心数学变换,把图像从空间域 (像素值) 变换到频率域 (各频率成分的强度),从而可以高效删除人眼不易察觉的高频成分。二维 DCT 的数学定义为 F(u,v) = (1/4) * C(u) * C(v) * Σ Σ f(x,y) * cos((2x+1)uπ/16) * cos((2y+1)vπ/16),其中 f(x,y) 是原像素值、F(u,v) 是频率系数、C(u) 是归一化常数。该变换是可逆的,用逆 DCT (IDCT) 即可还原像素值 (在量化之前可完整还原)。

小波变换 - JPEG 2000 与下一代压缩的基础

小波变换将图像分解为不同尺度和方向的分量,提供比 DCT 更灵活的多分辨率分析能力。JPEG 2000 采用小波变换作为核心,消除了 DCT 的块效应问题。

小波变换的基本原理:

对图像分别在水平和垂直方向进行滤波和下采样,得到四个子带:LL (低频近似)、LH (水平细节)、HL (垂直细节)、HH (对角细节)。对 LL 子带递归执行相同操作,形成多级分解。

与 DCT 的对比:

  • 无块效应:小波变换作用于整幅图像,不存在块边界
  • 多分辨率:天然支持渐进式传输,先传低分辨率再逐步细化
  • 空间自适应:不同区域可以分配不同的比特数
  • 计算复杂度:与 DCT 相当,但内存需求更大

JPEG 2000 的特性:

  • 支持无损和有损压缩 (使用不同的小波滤波器)
  • 感兴趣区域 (ROI) 编码:对重要区域分配更多比特
  • 渐进式解码:从低质量到高质量逐步显示
  • 在低比特率下质量明显优于 JPEG

实际应用:

JPEG 2000 在医学影像 (DICOM)、数字电影 (DCI) 和卫星图像等专业领域广泛使用。但在 Web 领域,由于浏览器支持有限和编解码速度较慢,未能取代 JPEG。WebP 和 AVIF 在 Web 场景中提供了更好的替代方案。

小波变换的分解与编码:小波变换 (Wavelet Transform) 是为克服 DCT 的局限而开发的变换方法,用于 JPEG 2000、HEIF 的部分模式以及医疗图像 (DICOM) 等。它把图像分离为「近似成分 (低频)」与「细节成分 (高频)」,在水平与垂直方向分别滤波,分解为 LL、LH、HL、HH 四个子带;再对 LL 子带递归地施加同样的分解,通常做 3-5 级,从粗结构到细节做分层表达。各子带的系数经量化后,用 EBCOT (Embedded Block Coding with Optimized Truncation) 等高级编码方式压缩。

相对 DCT 的优势:因整幅图像一次性处理,不会出现 JPEG 特有的 8x8 块边界噪声;可从低分辨率到高分辨率分级传输,便于按网络带宽调整质量;还支持 ROI (Region of Interest) 编码,只把特定区域保持高质量、其余区域降质。JPEG 2000 使用的 CDF 9/7 小波 (有损) 与 CDF 5/3 小波 (无损),其滤波系数针对图像压缩做了最优化。

预测编码与帧内预测 - AV1/HEVC 的高效压缩机制

预测编码利用已编码的相邻像素来预测当前像素的值,只编码预测残差 (实际值与预测值的差)。残差通常接近零,可以用更少的比特表示。

帧内预测模式:

现代编解码器提供多种预测方向:

  • HEVC: 35 种帧内预测模式 (33 个角度方向 + DC + Planar)
  • AV1: 56 种帧内预测模式,加上调色板模式和滤波帧内预测
  • DC 模式:使用相邻像素的平均值作为预测,适合平坦区域
  • Planar 模式:使用双线性插值预测,适合渐变区域
  • 角度模式:沿特定方向外推相邻像素值,适合边缘和纹理

编码器的模式决策:

编码器对每个块尝试所有可用的预测模式,选择率失真代价 (Rate-Distortion Cost) 最低的模式。这是编码器计算量最大的部分,也是编码速度远慢于解码速度的主要原因。

变换块大小自适应:

  • 平坦区域使用大块 (32x32 或 64x64),减少开销
  • 细节丰富区域使用小块 (4x4 或 8x8),保留细节
  • 编码器通过递归分割找到最优的块划分方案

对图像压缩的意义:

AVIF (基于 AV1) 和 HEIC (基于 HEVC) 将视频编解码器的帧内预测技术应用于静态图像压缩,在相同质量下比 JPEG 节省 50% 以上的文件大小。

预测编码与帧内预测:预测编码 (Predictive Coding) 从已处理的邻近像素预测当前像素值,只对与预测值之差 (残差) 编码;预测越准残差越小、压缩率越高,它是 AVIF (AV1) 与 HEIF (HEVC/H.265) 所用最新压缩技术的核心。帧内预测 (Intra Prediction) 的方向预测模式在 AV1 中有 56 个方向 (HEVC 为 35 个),包括水平、垂直、斜 45 度、斜 22.5 度等,把邻块的像素值按各种角度外推到当前块。DC 预测用邻近像素的平均值预测整块,在天空、墙面等均匀区域有效。Paeth 预测 (PNG) 从左、上、左上 3 个像素中选取最接近的值,用于 PNG 的无损压缩。CfL (Chroma from Luma) 是 AV1 独有的技术,从亮度 (Luma) 通道的信息预测色度 (Chroma) 通道,因色度与亮度相关性高,可大幅削减色度残差。

AV1 压缩效率高的原因:可变尺寸的块划分 (从 4x4 到 128 × 128 递归划分)、56 个方向的帧内预测模式、多种变换类型 (DCT、ADST、Identity) 的自适应选择、环路滤波 (去块、CDEF、Loop Restoration) 带来的质量提升,以及符号编码 (ANS: Asymmetric Numeral Systems) 实现的高效熵编码。

熵编码 - Huffman 编码与算术编码原理

熵编码是压缩流程的最后一步,对量化后的系数进行无损压缩。其目标是使编码后的平均比特数接近信息论中的熵下界。

Huffman 编码:

  • 为出现频率高的符号分配短码字,频率低的分配长码字
  • 码字长度为整数比特,因此无法完全达到熵下界
  • JPEG 基线使用 Huffman 编码,实现简单且解码速度快
  • 需要预先构建码表,通常使用标准码表或两遍扫描

算术编码:

  • 将整个符号序列编码为一个分数,理论上可以达到熵下界
  • 比 Huffman 编码多压缩 5-10%,但计算复杂度更高
  • JPEG 2000、HEVC、AV1 均使用算术编码的变体
  • 上下文自适应:根据已编码的相邻符号动态调整概率模型

上下文建模:

现代编解码器使用上下文自适应二进制算术编码 (CABAC)。根据当前符号的上下文 (相邻已编码符号的值) 选择不同的概率模型,使概率估计更准确,从而提高压缩效率。

ANS (非对称数字系统):

ANS 是近年来兴起的熵编码方法,结合了算术编码的压缩效率和 Huffman 编码的解码速度。Zstandard (zstd) 和部分图像编解码器已采用 ANS。

主要熵编码方式:Huffman 编码 (Huffman Coding) 用于 JPEG,按出现概率给各符号分配变长前缀码 —— 高频符号用短码 (例如 2 位)、罕见符号用长码 (例如 12 位);实现简单且高速,但每个符号至少需要 1 位,因此达不到理论极限。算术编码 (Arithmetic Coding) 用于 JPEG 2000 与 H.264 (CABAC),把整个符号序列表达为 0-1 区间内的一个数值,压缩率比 Huffman 编码高 5-10%,但计算成本更高。ANS (Asymmetric Numeral Systems) 是 AV1、Zstandard 采用的最新方式,以接近 Huffman 编码的速度实现与算术编码相当的压缩率,其编码与解码是非对称的 (LIFO 结构)。上下文建模根据周围符号的取值动态更新概率模型,CABAC (Context-Adaptive Binary Arithmetic Coding) 用邻块信息预测当前符号的概率,从而提升编码效率。

香农熵的公式H = -Σ p(x) * log2(p(x)),该值表示理论上每个符号的最小位数。例如两个符号以等概率 (50%/50%) 出现时,熵为 1 位/符号;若其中一方以 99% 的概率出现,熵约为 0.08 位/符号,即可大幅压缩。

压缩质量评估指标 - PSNR、SSIM、VMAF 的区别与应用

评估图像压缩质量需要客观指标。不同指标从不同角度衡量压缩失真,选择合适的指标对于压缩参数优化至关重要。

PSNR (峰值信噪比):

  • 基于像素级均方误差 (MSE) 计算,单位为 dB
  • 计算简单快速,是最传统的质量指标
  • 局限:与人眼感知相关性较低,相同 PSNR 的图像视觉质量可能差异很大
  • 参考值:30dB 以下质量较差,40dB 以上几乎无法察觉失真

SSIM (结构相似性):

  • 从亮度、对比度、结构三个维度评估相似性
  • 比 PSNR 更符合人眼感知,是目前最广泛使用的指标
  • 取值范围 0-1,1 表示完全相同
  • 变体:MS-SSIM (多尺度) 在不同分辨率下评估,相关性更高

VMAF (视频多方法评估融合):

  • Netflix 开发的机器学习质量指标
  • 融合多种底层指标,通过主观评分数据训练
  • 与人眼感知相关性最高,但计算成本也最高
  • 取值范围 0-100,93 以上被认为是优秀质量

实际应用建议:

  • 快速批量评估:使用 SSIM
  • 精确质量优化:使用 VMAF
  • 学术论文对比:PSNR 和 SSIM 并用
  • Web 图像优化:以 SSIM > 0.95 或 VMAF > 90 为目标

各质量评估指标的定义:PSNR (Peak Signal-to-Noise Ratio) 是最经典的指标,由原图与压缩图的像素值之差 (MSE:均方误差) 计算 —— PSNR = 10 * log10(MAX^2 / MSE),单位为 dB,值越大质量越高,一般 30dB 以上视为「可接受」、40dB 以上视为「高质量」;计算简单高速,但有时与人的知觉不一致 (无法检出结构性失真)。SSIM (Structural Similarity Index) 模仿人类视觉系统,用亮度、对比度、结构这 3 个要素评价相似度,取值 0-1,1 为完全一致,0.95 以上视为「知觉上等同」。VMAF (Video Multimethod Assessment Fusion) 是 Netflix 开发的机器学习指标,组合 VIF、DLM、Motion 等多个特征量,与人的主观评价 (MOS: Mean Opinion Score) 相关性最高,取值 0-100,93 以上为「优秀」。Butteraugli 是 Google 开发的知觉质量指标,对人眼的空间频率敏感度与掩蔽效应建模,用于 JPEG XL 的质量控制。

实务中的取舍:需要高速比较大量图像时用 SSIM,需要最准确的知觉质量评价时用 VMAF,压缩参数的自动调优则适合用 Butteraugli;建议组合多个指标做综合判断。

相关文章

图像压缩原理详解 - JPEG、PNG 和 WebP 的工作机制

通俗易懂地讲解图像压缩的工作原理。涵盖 JPEG 的 DCT 变换、PNG 的滤波与 Deflate,以及 WebP 的技术特点。

图像格式对比 - JPEG/PNG/WebP/AVIF/GIF/BMP 的特性与适用场景

全面对比主流图像格式的特性、压缩效率和适用场景。从传统格式到新一代格式,提供基于用途的最佳选择指南。

小波变换与 JPEG 2000 - 图像压缩的多分辨率分析

深入讲解小波变换在图像压缩中的应用。涵盖离散小波变换、JPEG 2000 编码流程、EBCOT 位平面编码机制及实际应用。

图像频率域分析基础 - 理解空间频率与频谱

系统讲解图像频率域分析的基础概念。涵盖空间频率、傅里叶变换、频谱解读和频率域处理的应用。

无损压缩与有损压缩对比 - 图像压缩方式选择指南

深入对比 PNG 无损压缩与 JPEG 有损压缩的算法原理、文件大小差异和适用场景。附带压缩率实测数据,帮助你为照片、图标和 Web 图像选择最佳方案。

傅里叶滤波去噪 - 频率域图像处理

系统讲解利用傅里叶变换进行图像去噪的技术。涵盖低通滤波、高通滤波、陷波滤波、维纳滤波及 Python 实现。

相关术语