深入图像压缩算法 - DCT、小波变换与预测编码
图像压缩的基本原理 - 冗余消除与信息理论
图像压缩的本质是消除数据中的冗余信息。原始图像数据包含大量冗余,通过识别和消除这些冗余可以大幅减小文件体积。
三种冗余类型:
- 空间冗余: 相邻像素之间高度相关,颜色值变化通常很小
- 频率冗余: 人眼对高频细节不敏感,可以丢弃部分高频信息
- 编码冗余: 固定长度编码未利用符号出现概率的差异
无损压缩 vs 有损压缩:
- 无损压缩: 仅消除编码冗余和空间冗余,可完全还原原始数据。PNG、GIF 采用此方式
- 有损压缩: 额外消除频率冗余 (丢弃人眼不敏感的信息),压缩率更高但不可逆。JPEG、WebP、AVIF 采用此方式
有损压缩的通用流程:
- 色彩空间转换 (RGB → YCbCr)
- 色度下采样 (利用人眼对色度分辨率低的特性)
- 变换编码 (DCT 或小波变换,将空间域转为频率域)
- 量化 (降低精度,这是信息丢失的主要步骤)
- 熵编码 (对量化后的系数进行无损压缩)
DCT (离散余弦变换) - JPEG 的核心技术
DCT 将图像从空间域转换到频率域,是 JPEG 压缩的核心。转换后,图像的能量集中在少数低频系数上,高频系数可以被量化为零而不显著影响视觉质量。
JPEG 的 DCT 流程:
- 将图像分割为 8x8 像素块
- 对每个块进行二维 DCT 变换
- 得到 64 个频率系数 (左上角为 DC 系数,其余为 AC 系数)
- 使用量化矩阵对系数进行量化 (除以量化步长并取整)
- 对量化后的系数进行 Zigzag 扫描排列
- 使用游程编码和 Huffman 编码进行熵编码
量化矩阵的作用:
量化矩阵决定了每个频率系数的精度保留程度。低频系数 (左上角) 使用较小的量化步长以保留更多信息,高频系数 (右下角) 使用较大的步长允许更多信息丢失。JPEG 质量参数本质上是对量化矩阵的缩放。
DCT 的局限性:
- 8x8 块边界在低质量时产生明显的块效应
- 固定块大小无法适应图像内容的局部特性
- 对于边缘和纹理区域,块效应尤为明显
改进方案:
JPEG 2000 使用小波变换替代 DCT 消除块效应。现代编解码器 (HEVC、AV1) 使用可变大小的变换块 (4x4 到 64x64),根据内容自适应选择最优块大小。
小波变换 - 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 场景中提供了更好的替代方案。
预测编码与帧内预测 - AV1/HEVC 的高效压缩机制
预测编码利用已编码的相邻像素来预测当前像素的值,只编码预测残差 (实际值与预测值的差)。残差通常接近零,可以用更少的比特表示。
帧内预测模式:
现代编解码器提供多种预测方向:
- HEVC: 35 种帧内预测模式 (33 个角度方向 + DC + Planar)
- AV1: 56 种帧内预测模式,加上调色板模式和滤波帧内预测
- DC 模式: 使用相邻像素的平均值作为预测,适合平坦区域
- Planar 模式: 使用双线性插值预测,适合渐变区域
- 角度模式: 沿特定方向外推相邻像素值,适合边缘和纹理
编码器的模式决策:
编码器对每个块尝试所有可用的预测模式,选择率失真代价 (Rate-Distortion Cost) 最低的模式。这是编码器计算量最大的部分,也是编码速度远慢于解码速度的主要原因。
变换块大小自适应:
- 平坦区域使用大块 (32x32 或 64x64),减少开销
- 细节丰富区域使用小块 (4x4 或 8x8),保留细节
- 编码器通过递归分割找到最优的块划分方案
对图像压缩的意义:
AVIF (基于 AV1) 和 HEIC (基于 HEVC) 将视频编解码器的帧内预测技术应用于静态图像压缩,在相同质量下比 JPEG 节省 50% 以上的文件大小。
熵编码 - Huffman 编码与算术编码原理
熵编码是压缩流程的最后一步,对量化后的系数进行无损压缩。其目标是使编码后的平均比特数接近信息论中的熵下界。
Huffman 编码:
- 为出现频率高的符号分配短码字,频率低的分配长码字
- 码字长度为整数比特,因此无法完全达到熵下界
- JPEG 基线使用 Huffman 编码,实现简单且解码速度快
- 需要预先构建码表,通常使用标准码表或两遍扫描
算术编码:
- 将整个符号序列编码为一个分数,理论上可以达到熵下界
- 比 Huffman 编码多压缩 5-10%,但计算复杂度更高
- JPEG 2000、HEVC、AV1 均使用算术编码的变体
- 上下文自适应: 根据已编码的相邻符号动态调整概率模型
上下文建模:
现代编解码器使用上下文自适应二进制算术编码 (CABAC)。根据当前符号的上下文 (相邻已编码符号的值) 选择不同的概率模型,使概率估计更准确,从而提高压缩效率。
ANS (非对称数字系统):
ANS 是近年来兴起的熵编码方法,结合了算术编码的压缩效率和 Huffman 编码的解码速度。Zstandard (zstd) 和部分图像编解码器已采用 ANS。
压缩质量评估指标 - 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 为目标