图片及视频压缩
YUV 色彩相关
之前讲过,有很多色彩模型。而在有损压缩时,最常用的就是 YUV。具体而言,是 YUV 的一种:
\[ \text{Y},\text{C}_\text{b},\text{C}_\text{r} \]
YUV、RGB 互转
规定以下常数:
\[ \begin{aligned} & W_R,W_G,W_B,\\ & U_\text{max}, V_\text{max}. \end{aligned} \]
其中,\(W_R,W_G,W_B\) 为分别对应 \(R,G,B\) 的权重,同时满足 \(W_R+W_G+W_B=1\). \(U_\text{max}, V_\text{max}\) 分别为 \(U,V\) 色度的最大值。
Y’UV 一般由 RGB (Gamma 矫正过的,而非线性 RGB)计算而得,如下:
\[ \begin{aligned} Y'&= W_RR' + W_GG' + W_BB'\\ U &= U_\text{max} \frac{B' - Y'}{1 - W_B}, \\ V &= V_\text{max} \frac{R' - Y'}{1 - W_R}. \end{aligned} \]
其中,\('\) 号表示 Gamma 矫正。
Y’UV 三个色度的范围分别为 \([0,1]\), \([-U_\text{max},U_\text{max}]\), \([-V_\text{max},V_\text{max}]\).
简而言之,\(Y'\) 定义为 RGB 加权之和,权重是根据人类视锥细胞决定的,所以 \(W_G\) 往往最大。
等效的颜色矩阵:
\[ \begin{bmatrix} Y' \\ U \\ V \end{bmatrix} = \begin{bmatrix} W_R & W_G & W_B \\ -U_\text{max} \cdot \frac{W_R}{1 - W_B} & -U_\text{max} \cdot \frac{W_G}{1 - W_B} & U_\text{max} \\ V_\text{max} & -V_\text{max}\cdot\frac{W_G}{1 - W_R} & -V_\text{max}\cdot\frac{W_B}{1-W_R} \end{bmatrix} \begin{bmatrix} R' \\ G' \\ B' \end{bmatrix} \]
及其逆:
\[ \begin{bmatrix} R' \\ G' \\ B' \end{bmatrix}= \begin{bmatrix} 1 & 0 & \frac{1-W_R}{V_\text{max}} \\ 1 & \frac{W_B(1 - W_B)}{U_\text{max}W_G} & \frac{W_R^2-W_R}{W_G V_\text{max}} \\ 1 & \frac{1-W_B}{U_\text{max}} & 0 \end{bmatrix} \begin{bmatrix} Y' \\ U \\ V \end{bmatrix} \]
在 BT.490
中,常数定义为:
\[ \begin{aligned} W_R &= 0.299, \\ W_G &= 1 - W_R - W_B = 0.587, \\ W_B &= 0.114, \\ U_\text{max} &= 0.436, \\ V_\text{max} &= 0.615. \end{aligned} \]
可得颜色矩阵为:
\[ \begin{bmatrix} Y' \\ U \\ V \end{bmatrix} = \begin{bmatrix} 0.299 & 0.587 & 0.114 \\ -0.14713 & -0.28886 & 0.436 \\ 0.615 & -0.51499 & -0.10001 \end{bmatrix} \begin{bmatrix} R' \\ G' \\ B' \end{bmatrix} \\ \]
及其逆:
\[ \begin{bmatrix} R' \\ G' \\ B' \end{bmatrix} = \begin{bmatrix} 1 & 0 & 1.13983 \\ 1 & -0.39465 & -0.58060 \\ 1 & 2.03211 & 0 \end{bmatrix} \begin{bmatrix} Y' \\ U \\ V \end{bmatrix}. \]
在 BT.709
中,常数定义为:
\[ \begin{aligned} W_R &= 0.2126, \\ W_G &= 1 - W_R - W_B = 0.7152, \\ W_B &= 0.0722, \\ U_\text{max} &= 0.436, \\ V_\text{max} &= 0.615. \end{aligned} \]
可得颜色矩阵:
\[ \begin{bmatrix} Y' \\ U \\ V \end{bmatrix} = \begin{bmatrix} 0.2126 & 0.7152 & 0.0722 \\ -0.09991 & -0.33609 & 0.436 \\ 0.615 & -0.55861 & -0.05639 \end{bmatrix} \begin{bmatrix} R' \\ G' \\ B' \end{bmatrix} \]
及其逆:
\[ \begin{bmatrix} R' \\ G' \\ B' \end{bmatrix} = \begin{bmatrix} 1 & 0 & 1.28033 \\ 1 & -0.21482 & -0.38059 \\ 1 & 2.12798 & 0 \end{bmatrix} \begin{bmatrix} Y' \\ U \\ V \end{bmatrix} \]
一般地,YUV 容易和 YCbCr 混淆。主要是 YUV 同时作为分类名(泛指所有类似的颜色系统),和其分类下的项名(具体区别如下所示)。
技术上,YCbCr 的 \(U_\text{max}\) 及 \(V_\text{max}\) 为 \(\frac{1}{2}\);用途上,YUV 针对模拟电视,YCbCr 用于数字电视。
同时,YCbCr 具有 Full Range 和 Video Range 两种。Video Range 的 \(Y'\) 在 \([16,235]\) 间,\(U\) 及 \(V\) 在 \([16,240]\) 间。
色度抽样
根据人眼对亮度信息最敏感,而对色度信息的敏感度则次之的特点。可使用色度抽样(Chroma Subsample)节省开销。
正如上面所说的那样,看到这幅图后,人眼的确对色度通道感知较不明显。
色度抽样,其实就是降低色度的分辨率,让其为原来的 \(1/2\) 或 \(1/4\).
主要就只有这三种模式。其中 \(4:2:0\) 比较特殊,是轮流采样 Cb 和 Cr。其实也不必太在意这之间的区别。这大同小异。总体而言,\(4:2:0\) 业已满足基本视频需要,几乎你能看到的所有视频,都是这个规格。而 \(4:2:2\) 和 \(4:4:4\) 则用于更高画质或视频制作。
原来一个 \(2\times2\) 区域内,有 \(3\times4=12\) 位数字。经过 \(4:2:0\) 采样后,仅剩 \(6\) 位数字。压缩率 \(r\) 为 \(2:1\).
量化
如上篇文章里所说的,我们可以使用诸如 DCT、FFT、MDCT 之类的正交变换,将空间域转换为频率域。便于处理。
可以看到,信息几乎被集中到了左上角。可以说,左上角是低频信息,而右下角附近的,是高频信息。第 1 - 3 张是渐变图,颜色变化连续且规律,因此几乎所有信息都是低频信息。第四张是加入少量噪点的渐变图,但仍然很规律。第五张的锐利边缘产生了高频信息。而第六张是纯噪点,有很多低频信息。
很显然,DCT 的特性适合压缩。
- DCT 产生大量连续的 0,这对熵编码有利。
- DCT 后的图像呈频率特征,利于量化压缩。
对于左上角的高数值,常称为 DC 系数,高频部分的数值常称为 AC 系数。(词源直流电和交流电)。
对于解码器,需要使用 IDCT 将 DCT 频率域图像转回空间域。DCT 变换本身是可逆的,但不是无损的。即使不执行额外的操作,也有细微的精度损失。所以对于使用了 DCT 的图像压缩方法,都是有损方法。
JPEG 量化矩阵
JPEG 标准亮度量化矩阵:
\[ \begin{bmatrix} 16 & 11 & 10 & 16 & 24 & 40 & 51 & 61 \\ 12 & 12 & 14 & 19 & 26 & 58 & 60 & 55 \\ 14 & 13 & 16 & 24 & 40 & 57 & 69 & 56 \\ 14 & 17 & 22 & 29 & 51 & 87 & 80 & 62 \\ 18 & 22 & 37 & 56 & 68 & 109 & 103 & 77 \\ 24 & 35 & 55 & 64 & 81 & 104 & 113 & 92 \\ 49 & 64 & 78 & 87 & 103 & 121 & 120 & 101 \\ 72 & 92 & 95 & 98 & 112 & 110 & 103 & 99 \end{bmatrix} \]
如何使用这张表?在上一篇文章中,我们讲解了恒定的量化步长。这张表即定义了对频率域数值的量化步长。
稍微复习一下:量化步长越大,精度损失越高,同时压缩率也越高。
实际上,这张 \(8\times 8\) 的矩阵是统计学的结果。不过稍有规律可循:
- 总体而言,随着频率降低(越接近右下),量化步长提高。
- 对于 DC 系数,可以看到它比周围点的量化步长稍高。这主要是为了将其落回 \(8\,\text{Bit}\). 这对精度没有太大影响。
- 对于最右下角,量化步长却较周围降低了。此举意义在于,让线条更明晰。
JPEG 标准色度量化矩阵:
\[ \begin{bmatrix} 17 & 18 & 24 & 47 & 99 & 99 & 99 & 99 \\ 18 & 21 & 26 & 66 & 99 & 99 & 99 & 99 \\ 24 & 26 & 56 & 99 & 99 & 99 & 99 & 99 \\ 47 & 66 & 99 & 99 & 99 & 99 & 99 & 99 \\ 99 & 99 & 99 & 99 & 99 & 99 & 99 & 99 \\ 99 & 99 & 99 & 99 & 99 & 99 & 99 & 99 \\ 99 & 99 & 99 & 99 & 99 & 99 & 99 & 99 \\ 99 & 99 & 99 & 99 & 99 & 99 & 99 & 99 \end{bmatrix} \]
和亮度矩阵类似,但色度的复杂度更低。很多低频信息用以 \(99\) 的量化步长,并最终变为 \(0\)。
几乎所有编码器都有的一个参数叫做:QP(Quantization Parameter),或者 Q(Quality)。此值,则一般控制量化步长。这产生几个效果:
- 量化步长以下的的值变多了,即,0 变多了。
- 量化粒度变粗。
- Huffman 压缩效率提高。
- 往往一种压缩算法有一个或多个甜蜜点。(例如 JPEG 为 75。)质量在这一点后出现明显变化。
Zig Zag
DCT 所需资源不小。如果对整张图进行 DCT,未免效率太低。所以图像常被划分为矩形(在 HEVC 等方法中,允许长方形区域存在)。
分块后,需要一个合理的储存方式,而 Zigzag 无疑是合理的。
显然的,这样扫描有利于同色区块聚集,提高压缩效率。但请注意,仅仅是储存方式是 Zigzag,这不代表 DCT 计算过程必须按此顺序。DCT 计算过程完全可以同步进行。
Zigzag 的每一个分块被称为宏块(Macroblock)。
时域压缩
一张图像只不过是多少帧图像之一。单纯地叠加静帧效率太低。
核心思想是:帧和帧之间的运动,是连续的,相邻的帧,大部分都相同。
在极端一点的情况,比如一图流。这样就尤显低效。
IPB 帧
I 帧(Intra Frame),又或者说关键帧。它类似一张静态图片,不参考其他任何帧。
P 帧(Predicted Frame),即前向参考帧。它参考一个 GOP(稍后解释) 内所解码的所有前项帧。
B 帧(Bidirectional Predicted Frame),即双向参考帧,同时参考 GOP 内的前项和后向帧。
可以看出,B 帧的引入让事情复杂了许多。非 I 帧比例越高,资源消耗越高,这是显然的。
所以固然需要将帧分块(和之前一个道理),即分成,GOP(Group of Picture),图像组。GOP 中的第一个 I 帧,称为 IDR 帧(Instantaneous Decoding Refresh),当解码器遇到该帧,将清除所有之前帧缓存,并不再参考这之前的帧。
诚然,上述描述仅仅是对基本时域编码的一个高度抽象性描述。可能仅与原始的 MPEG-1 水平相当。
累了,不写了。下回再更。