Featured image of post 【6.050J】CH 3 - Compression

【6.050J】CH 3 - Compression

3.1 变长编码(Variable-Length Encoding)

核心思想

  • 高频符号 → 短码
  • 低频符号 → 长码
    这样可以降低平均码长,从而实现压缩
    这种操作既可以在 源编码器(source encoder) 里完成,也可以交给单独的 compressor 来做

历史类比:摩尔斯电码

  • 在第2章教材就提过:摩尔斯电码是最早的变长编码例子
    • 高频字母(如 E, T)用短符号(. 或 -
    • 低频字母(如 Q, Z)用更长符号
  • 整体上平均下来,比“所有字母都等长”要节省
    这就是平均意义上的压缩

数学直觉

  • 设字母表$X={x1​,…,xn​}$,每个符号概率为 $p(xi​)$,对应码长$L(xi​)$
  • 平均码长:
    $Lˉ=i∑​p(xi​)L(xi​)$
  • 如果符号频率极不均衡,合理设计 $L(xi)$ 可以大幅减少 $Lˉ$
  • 极限情况:$Lˉ≥H(X)$ (这在信息论的“源编码定理”里严格证明)

必须满足的条件:前缀码

  • 问题:如果不小心设计出“某个码是另一个码的前缀”,解码就会歧义
    • 例:若 A=0B=01,那 01 到底是 A + ? 还是 B
  • 解决:用 前缀码(prefix-free code)。任何码字都不是另一码字的前缀
    • 例如摩尔斯电码通过加空格来实现同步(虽然摩尔斯本身不是严格前缀码)

优缺点

✅ 优点

  • 压缩效果显著(尤其是分布不均时)
  • 概念简单,广泛应用(霍夫曼、算术编码等都属于变长编码)
    ⚠️ 缺点
  • 错误传播:比定长码更敏感,一旦某个 bit 错位,后面可能全错
  • 同步问题:需要精心设计(前缀码 / 加分隔符)
    太好了 👍 你这个格式清晰明了,完全可以拿来当讲义。那我就按照你给的 Markdown 格式,把 3.2 游程编码(Run-Length Encoding, RLE) 整理成同样的结构,方便你直接接着用。

3.2 游程编码(Run-Length Encoding, RLE)

核心思想

  • 连续重复的符号 → 压缩为 (符号, 次数)
    • 这样避免逐个重复写符号,用更短的表示来存储长序列
  • 适合有长片段重复的数据

例子

原始消息:
a B B B B B a a a B B a a a a
编码后:
a 1 B 5 a 3 B 2 a 4

历史/应用类比

  • 国旗示例:德国国旗(黑、红、黄三条纯色带),可以只存“黑多少行、红多少行、黄多少行”,而不是每个像素逐一存
  • 传真技术:黑白文档扫描 → 只需传“多少个白点/黑点”,因为只有两种颜色,不需要重复写颜色本身

数学直觉

  • 假设一段连续符号长度为 $k$:
    • 普通存储:需要 $k$ 个符号
    • RLE 存储:只需 1 个符号 + 次数表示($\log k$ 位)
  • 当 $k$ 很大时,压缩率接近 $1/k$,节省极大

必须满足的条件

  • 数据必须存在长游程(长段重复),否则压缩效果很差
  • 编码格式必须明确区分“符号本身”和“次数表示”

优缺点

✅ 优点

  • 对图像大色块、二值文档等非常高效
  • 算法简单,编码/解码速度快
    ⚠️ 缺点
  • 对照片、彩色渐变等场景几乎无压缩效果,甚至可能变大(因为要额外存次数)
  • 噪声敏感:即便数据本身相似,但被噪声打断游程,压缩率也会急剧下降

3.3 静态字典(Static Dictionary)

核心思想

  • 如果编码系统有未用到的码字,就可以把它们分配给高频的字符串,作为缩写
  • 这样一整个常用词(如“the”)就能用一个码字表示,节省空间
  • 这种字典(codebook)是静态的,即在所有消息中固定不变

历史/应用类比

  • 英国海军百叶窗光学电报(1796)
    • 每个信号站有6片百叶,开/关组合可形成64种状态
    • 除了字母、数字和控制符号外,多余的状态被分配给常见词语和短语,例如 “the”“Portsmouth”“Admiral”“east”等
    • 从伦敦到普利茅斯 500 英里,信息往返仅需3分钟

数学直觉

  • 假设原来常用词需要 $k$ 个字母 → $kL$ 比特(每字母$L$比特)
  • 如果用未用码字替换,只需 $L$ 比特
  • 平均码长减少,压缩率取决于该常用词出现的频率

必须满足的条件

  • 所有通信双方必须事先共享同一份字典
  • 字典不能随意更改,否则解码会失败

优缺点

✅ 优点

  • 一次分发,长期复用;适合领域内高频短语固定的场景
  • 对“专业、固定语境”的通信(如军事/协议)非常高效
    ⚠️ 缺点
  • 错误放大:一个比特错误可能导致完全错误的词语(如“east”变“south”)
  • 适应性差:面对多样化文本时效果很差;难以覆盖所有场景

3.4 半自适应字典(Semi-adaptive Dictionary)

核心思想

  • 与静态字典不同,半自适应字典是针对每条消息单独构建
  • 能更好地利用该消息的高频模式,提高压缩率

数学直觉

  • 分析整条消息,找出最常见的符号串作为字典项
  • 压缩效果比静态字典更好,但需要额外传输字典,开销增加

必须满足的条件

  • 必须完整读取消息后才能分析并生成字典 → 导致高延迟
  • 发送方需附带字典,接收方才能解码 → 增加额外传输成本
  • 需要足够内存来存放整条消息和字典

优缺点

✅ 优点

  • 针对性强,压缩率通常更高
    ⚠️ 缺点
  • 延迟大
  • 字典传输开销高
  • 存储需求大

3.5 动态字典(Dynamic Dictionary, LZW)

核心思想

  • 在处理消息的过程中,边读边生成字典
  • 字典不需要随消息一起传输,编码器和解码器都能在运行中同步构建
  • 代表算法:LZW (Lempel–Ziv–Welch)

背景

  • Lempel 和 Ziv 提出了 LZ77 / LZ78 系列算法
  • Welch 在 1984 年改进为 LZW,满足了“无需传输字典、单次扫描、可逆”的要求
  • 被广泛用于文本压缩和图像压缩(如 GIF 格式

数学直觉

  • 初始字典只包含所有可能的单字符(以及控制符号 Start / Stop)
  • 在读消息时:
    • 如果新串在字典中 → 继续扩展
    • 如果新串不在字典中 → 输出旧串的码字,并把新串加入字典
  • 解码端用相同规则同步建字典 → 无需传字典本身

必须满足的条件

  • 编码器和解码器的初始字典一致(通常是 ASCII 表)
  • 都按照相同规则在相同顺序更新字典

优缺点

✅ 优点

  • 无需传字典,传输开销小
  • 单次扫描,适合流式处理
  • 压缩率较高,尤其在重复模式较多的文本/图像上可达约 2×
  • 应用广泛:ZIP、GIF、TIFF 等
    ⚠️ 缺点
  • 在数据没有重复模式时,压缩率不高
  • 历史上有过专利限制(现已过期)

3.6 不可逆压缩技术 (Irreversible / Lossy Compression)

核心思想

  • 允许丢失部分信息,解码时只能得到“近似”的原始数据
  • 目标是:对人类感知或应用需求来说 “足够好”,但比无损压缩节省得更多

特点

  • 解码结果 ≠ 原始数据,但在感知上差异不明显
  • 压缩比通常远高于无损方法
  • 常用在图像、音频、视频、多媒体等场景

常见例子

  • 浮点数表示:有限精度的小数存储本质上就是有损(部分小数无法精确表示)
  • JPEG 图像压缩:利用 离散余弦变换 (DCT) 把图像分解为频率成分,低频成分保留,高频成分(人眼不敏感)被丢弃
  • MP3 音频压缩:利用心理声学模型,去掉人耳听不到或不敏感的声音成分

数学直觉

  • 如果数据 $X$ 中的信息熵为 $H(X)$,无损压缩的码长下界是 $H(X)$
  • 有损压缩则是:放弃重建精确 $X$,只保证输出 $\hat{X}$ 与 $X$ 在某个失真度量 $D(X,\hat{X})$ 下“足够小”
  • 这在信息论中由 率失真理论 (Rate-Distortion Theory) 严格刻画

优缺点

✅ 优点

  • 压缩率极高
  • 更符合感知需求(关注“看起来/听起来”相似)
    ⚠️ 缺点
  • 信息不可逆丢失
  • 误差可能在多次处理/传输后积累
  • 需要仔细选择失真度量,确保“丢掉的部分”确实不重要

3.8 二维离散余弦变换 (2-D DCT)

核心思想

  • DCT 是 JPEG 图像压缩的核心步骤
  • 作用:把图像的像素块从 空间域 转换到 频率域
  • 在频率域中:
    • 低频成分(整体亮度、平滑变化)对人眼最重要 → 保留
    • 高频成分(边缘、细节、噪声)人眼不敏感 → 可丢弃或量化得更粗
  • 从而实现 有损压缩

数学直觉

  • 一维情况:向量 $I$ 经过矩阵 $C$ 变换得到 $O=C I$
    • $C$ 的每一行相当于一个 基函数(cos 波形)
    • $O$ 的元素就是输入在这些基函数上的“投影系数”
    • 二维情况:图像块是矩阵 $X$,经过 DCT 得到 $Y$:
      • $Y = C^{T} X C$
      • $C$ 是 DCT 变换矩阵
      • 可以反变换:$X = C Y C^{T}$

基本性质

  • DCT 的变换矩阵 $C$ 是 正交矩阵,其逆矩阵等于转置:$C^{-1} = C^{T}$
  • 每个 $Y_{ij}$ 对应一个 空间频率模式
  • 这些模式(称为 基图像 / basis images)像棋盘格一样:
    • 左上角:低频,整体平滑
    • 右下角:高频,快速变化

压缩原理

  • 把图像分成 8×8 小块(JPEG 标准)
  • 对每个块做 DCT,得到 64 个系数
  • 低频系数:保留得精细
  • 高频系数:量化时强烈压缩,很多直接置 0
  • 这样高频细节被舍弃,但整体视觉质量仍然保持

示例

  • 对 4×4/8×8/16×16 图像块,生成基图像:
    • 左上:均匀灰度(DC 分量,代表平均亮度)
    • 边缘附近:水平/垂直/斜线条纹
    • 右下:高频棋盘格图案
  • JPEG 的量化表会专门针对右下角(高频区域)系数压得更狠

优缺点

✅ 优点

  • 符合人眼感知特性(高频不敏感)
  • 有快速算法(类似 FFT),高效实现
  • 是 JPEG、MPEG 等图像/视频标准的核心
    ⚠️ 缺点
  • 有损,不可完全还原
  • 分块(8×8)可能造成 block artifacts(方格感)
  • 高频细节容易丢失
Licensed under CC BY-NC-SA 4.0
最后更新于 Sep 13, 2025 13:44 UTC
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计