深入图像压缩算法 - DCT、小波变换与预测编码
图像压缩的基本原理 - 冗余消除与信息理论
图像压缩的本质是消除数据中的冗余信息。原始图像数据包含大量冗余,通过识别和消除这些冗余可以大幅减小文件体积。
三种冗余类型:
- 空间冗余:相邻像素之间高度相关,颜色值变化通常很小
- 频率冗余:人眼对高频细节不敏感,可以丢弃部分高频信息
- 编码冗余:固定长度编码未利用符号出现概率的差异
无损压缩 vs 有损压缩:
- 无损压缩:仅消除编码冗余和空间冗余,可完全还原原始数据。PNG、GIF 采用此方式
- 有损压缩:额外消除频率冗余 (丢弃人眼不敏感的信息),压缩率更高但不可逆。JPEG、WebP、AVIF 采用此方式
有损压缩的通用流程:
- 色彩空间转换 (RGB → YCbCr)
- 色度下采样 (利用人眼对色度分辨率低的特性)
- 变换编码 (DCT 或小波变换,将空间域转为频率域)
- 量化 (降低精度,这是信息丢失的主要步骤)
- 熵编码 (对量化后的系数进行无损压缩)
未压缩图像的数据量:图像压缩是去除图像数据中的冗余 (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 流程:
- 将图像分割为 8x8 像素块
- 对每个块进行二维 DCT 变换
- 得到 64 个频率系数 (左上角为 DC 系数,其余为 AC 系数)
- 使用量化矩阵对系数进行量化 (除以量化步长并取整)
- 对量化后的系数进行 Zigzag 扫描排列
- 使用游程编码和 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;建议组合多个指标做综合判断。