无损压缩(lossless) 让文件变小,并且能完全还原原始内容。有损压缩(lossy) 通过永久删除一部分数据让文件更小,所以无法恢复原样。题目会要求你定义两者、为某个情境选择其中一种,并说明理由。
这一课承接采样音频大小,因为压缩的目的就是减小你刚算出的庞大数值。
用简单的话说,区别在哪里?
无损方法寻找规律,把数据存得更有效率,什么都不丢弃。文本文件、程序文件以及必须保持精确的数据都需要它。
有损方法丢弃人们不太可能察觉的细节。JPEG 格式的照片和 MP3 格式的音频是日常的例子。质量会略有下降,压缩得越多,丢失得越多。
| 特点 | 无损 | 有损 |
|---|---|---|
| 能否还原原样 | 能 | 不能 |
| 文件缩小程度 | 较小 | 通常小得多 |
| 质量 | 不变 | 降低 |
| 适合 | 文本、程序、医学扫描 | 观看用的照片、音乐、视频 |
游程编码如何运作?
游程编码(run-length encoding,RLE)是一种无损方法。它把连续相同的值替换成“值 + 次数”。
下面是用剑桥风格伪代码写的思路,字符串存放在 Data 中:
Count ← 1
FOR i ← 2 TO LENGTH(Data)
IF MID(Data, i, 1) = MID(Data, i - 1, 1) THEN
Count ← Count + 1
ELSE
OUTPUT MID(Data, i - 1, 1), Count
Count ← 1
ENDIF
NEXT i
OUTPUT MID(Data, LENGTH(Data), 1), Count
用 Data = “AAABCC”(6 个字符)追踪:
| i | 比较 | 动作 | Count |
|---|---|---|---|
| 开始 | 1 | ||
| 2 | A, A | 相同,加 1 | 2 |
| 3 | A, A | 相同,加 1 | 3 |
| 4 | B, A | 不同:输出 A 3 | 1 |
| 5 | C, B | 不同:输出 B 1 | 1 |
| 6 | C, C | 相同,加 1 | 2 |
| 循环结束后 | 输出 C 2 |
结果:A3 B1 C2。你可以在伪代码追踪训练器里逐步追踪这样的循环。
例题
黑白图像的一行存成 W W W W W W W W B B W W W W(14 个像素,W 为白色,B 为黑色)。用 RLE 压缩它,并说明这个方法是否无损。
第 1 步,把连续的值分组: 8 个白、2 个黑、4 个白。
第 2 步,写出值和次数: W8 B2 W4。
第 3 步,解码检查: W×8、B×2、W×4 正好还原出原来的 14 个像素。
结论: 14 个值变成 3 对,共 6 个存储项。因为解码能完全还原原始数据,所以 RLE 是无损的。
要留意的错误
常见的失误是以为压缩一定会让数据变小。
错误的答案: “ABCD” 压缩成 A1B1C1D1,所以更小。
学生数错了字符。A1B1C1D1 有 8 个字符,比原来的 4 个还多。
纠正:RLE 只有在值重复时才有帮助。没有连续重复的数据反而会变大。好的答案会说明节省的程度取决于数据中的规律。
自我检测
试做这些题,然后打开答案。
1. 用游程编码对 WWWBBWWWWW 编码。
显示答案
连续段:3 个 W、2 个 B、5 个 W。答案:W3 B2 W5。解码得到 WWW BB WWWWW,即原来的 10 个字符。
2. 一家医院保存用于诊断的扫描图像。应该用无损还是有损压缩?说明一个理由。
显示答案
无损。 有损压缩会永久删除细节,而医学图像中缺失的细节可能改变诊断。无损压缩保留每一个像素。
3. 说出流媒体音乐服务可能选择有损压缩的一个理由。
显示答案
有损文件小得多,所以下载更快、用的数据更少,而且大多数听众很难察觉质量的损失。
接下来学什么
在不同方法之间做选择,其实就是在大小与质量之间取舍,所以接着学习解释质量与存储的取舍。然后用练习集做综合题。
如果定义已经扎实,但情境回答仍然松散,老师可以在线上一对一计算机科学补习中为你反复训练。