FFmpeg 系列文章导航页
上一篇 FFmpeg 入门与实践 003 -
通用压缩方法及音频压缩
图片及视频压缩
YUV 色彩相关
之前讲过,有很多色彩模型。而在有损压缩时,最常用的就是
YUV。具体而言,是 YUV 的一种:
Y,Cb,Cr
YUV、RGB 互转
规定以下常数:
WR,WG,WB,Umax,Vmax.
其中,WR,WG,WB 为分别对应
R,G,B 的权重,同时满足 WR+WG+WB=1. Umax,Vmax 分别为 U,V 色度的最大值。
Y’UV 一般由 RGB (Gamma 矫正过的,而非线性 RGB)计算而得,如下:
Y′UV=WRR′+WGG′+WBB′=Umax1−WBB′−Y′,=Vmax1−WRR′−Y′.
其中,′ 号表示 Gamma
矫正。
Y’UV 三个色度的范围分别为 [0,1],
[−Umax,Umax], [−Vmax,Vmax].
简而言之,Y′ 定义为 RGB
加权之和,权重是根据人类视锥细胞决定的,所以 WG 往往最大。
等效的颜色矩阵:
⎣⎡Y′UV⎦⎤=⎣⎡WR−Umax⋅1−WBWRVmaxWG−Umax⋅1−WBWG−Vmax⋅1−WRWGWBUmax−Vmax⋅1−WRWB⎦⎤⎣⎡R′G′B′⎦⎤
及其逆:
⎣⎡R′G′B′⎦⎤=⎣⎡1110UmaxWGWB(1−WB)Umax1−WBVmax1−WRWGVmaxWR2−WR0⎦⎤⎣⎡Y′UV⎦⎤
在 BT.490
中,常数定义为:
WRWGWBUmaxVmax=0.299,=1−WR−WB=0.587,=0.114,=0.436,=0.615.
可得颜色矩阵为:
⎣⎡Y′UV⎦⎤=⎣⎡0.299−0.147130.6150.587−0.28886−0.514990.1140.436−0.10001⎦⎤⎣⎡R′G′B′⎦⎤
及其逆:
⎣⎡R′G′B′⎦⎤=⎣⎡1110−0.394652.032111.13983−0.580600⎦⎤⎣⎡Y′UV⎦⎤.
在 BT.709
中,常数定义为:
WRWGWBUmaxVmax=0.2126,=1−WR−WB=0.7152,=0.0722,=0.436,=0.615.
可得颜色矩阵:
⎣⎡Y′UV⎦⎤=⎣⎡0.2126−0.099910.6150.7152−0.33609−0.558610.07220.436−0.05639⎦⎤⎣⎡R′G′B′⎦⎤
及其逆:
⎣⎡R′G′B′⎦⎤=⎣⎡1110−0.214822.127981.28033−0.380590⎦⎤⎣⎡Y′UV⎦⎤
一般地,YUV 容易和 YCbCr 混淆。主要是 YUV
同时作为分类名(泛指所有类似的颜色系统),和其分类下的项名(具体区别如下所示)。
技术上,YCbCr 的 Umax 及
Vmax 为 21;用途上,YUV
针对模拟电视,YCbCr 用于数字电视。
同时,YCbCr 具有 Full Range 和 Video Range 两种。Video Range 的 Y′ 在 [16,235] 间,U 及 V 在 [16,240] 间。
色度抽样
根据人眼对亮度信息最敏感,而对色度信息的敏感度则次之的特点。可使用色度抽样(Chroma
Subsample)节省开销。
YUV 通道对比正如上面所说的那样,看到这幅图后,人眼的确对色度通道感知较不明显。
色度抽样,其实就是降低色度的分辨率,让其为原来的 1/2 或 1/4.
YUV 色度抽样主要就只有这三种模式。其中 4:2:0
比较特殊,是轮流采样 Cb 和
Cr。其实也不必太在意这之间的区别。这大同小异。总体而言,4:2:0
业已满足基本视频需要,几乎你能看到的所有视频,都是这个规格。而 4:2:2 和 4:4:4 则用于更高画质或视频制作。
原来一个 2×2 区域内,有
3×4=12 位数字。经过 4:2:0 采样后,仅剩 6 位数字。压缩率 r 为 2:1.
量化
如上篇文章里所说的,我们可以使用诸如 DCT、FFT、MDCT
之类的正交变换,将空间域转换为频率域。便于处理。
一系列 8x8 图像和其 Y’ DCT
后的对比图可以看到,信息几乎被集中到了左上角。可以说,左上角是低频信息,而右下角附近的,是高频信息。第
1 - 3
张是渐变图,颜色变化连续且规律,因此几乎所有信息都是低频信息。第四张是加入少量噪点的渐变图,但仍然很规律。第五张的锐利边缘产生了高频信息。而第六张是纯噪点,有很多低频信息。
图像高低频很显然,DCT 的特性适合压缩。
- DCT 产生大量连续的 0,这对熵编码有利。
- DCT 后的图像呈频率特征,利于量化压缩。
对于左上角的高数值,常称为 DC
系数,高频部分的数值常称为 AC
系数。(词源直流电和交流电)。
对于解码器,需要使用 IDCT 将 DCT 频率域图像转回空间域。DCT
变换本身是可逆的,但不是无损的。即使不执行额外的操作,也有细微的精度损失。所以对于使用了
DCT 的图像压缩方法,都是有损方法。
JPEG 量化矩阵
JPEG 标准亮度量化矩阵:
⎣⎡1612141418244972111213172235649210141622375578951619242956648798242640516881103112405857871091041211105160698010311312010361555662779210199⎦⎤
如何使用这张表?在上一篇文章中,我们讲解了恒定的量化步长。这张表即定义了对频率域数值的量化步长。
稍微复习一下:量化步长越大,精度损失越高,同时压缩率也越高。
实际上,这张 8×8
的矩阵是统计学的结果。不过稍有规律可循:
- 总体而言,随着频率降低(越接近右下),量化步长提高。
- 对于 DC 系数,可以看到它比周围点的量化步长稍高。这主要是为了将其落回
8Bit.
这对精度没有太大影响。
- 对于最右下角,量化步长却较周围降低了。此举意义在于,让线条更明晰。
JPEG 标准色度量化矩阵:
⎣⎡17182447999999991821266699999999242656999999999947669999999999999999999999999999999999999999999999999999999999999999999999999999⎦⎤
和亮度矩阵类似,但色度的复杂度更低。很多低频信息用以 99 的量化步长,并最终变为 0。
几乎所有编码器都有的一个参数叫做:QP(Quantization
Parameter),或者
Q(Quality)。此值,则一般控制量化步长。这产生几个效果:
- 量化步长以下的的值变多了,即,0 变多了。
- 量化粒度变粗。
- Huffman 压缩效率提高。
- 往往一种压缩算法有一个或多个甜蜜点。(例如 JPEG 为
75。)质量在这一点后出现明显变化。
Zig Zag
DCT 所需资源不小。如果对整张图进行
DCT,未免效率太低。所以图像常被划分为矩形(在 HEVC
等方法中,允许长方形区域存在)。
分块后,需要一个合理的储存方式,而 Zigzag 无疑是合理的。
Zigzag 扫描显然的,这样扫描有利于同色区块聚集,提高压缩效率。但请注意,仅仅是储存方式是
Zigzag,这不代表 DCT 计算过程必须按此顺序。DCT
计算过程完全可以同步进行。
Zigzag
的每一个分块被称为宏块(Macroblock)。
时域压缩
一张图像只不过是多少帧图像之一。单纯地叠加静帧效率太低。
核心思想是:帧和帧之间的运动,是连续的,相邻的帧,大部分都相同。
在极端一点的情况,比如一图流。这样就尤显低效。
IPB 帧
I 帧(Intra
Frame),又或者说关键帧。它类似一张静态图片,不参考其他任何帧。
P 帧(Predicted
Frame),即前向参考帧。它参考一个 GOP(稍后解释)
内所解码的所有前项帧。
B 帧(Bidirectional Predicted
Frame),即双向参考帧,同时参考 GOP 内的前项和后向帧。
仅 I 帧和 P 帧
I 帧、P 帧和 B 帧可以看出,B 帧的引入让事情复杂了许多。非 I
帧比例越高,资源消耗越高,这是显然的。
所以固然需要将帧分块(和之前一个道理),即分成,GOP(Group
of Picture),图像组。GOP 中的第一个 I
帧,称为 IDR 帧(Instantaneous
Decoding
Refresh),当解码器遇到该帧,将清除所有之前帧缓存,并不再参考这之前的帧。
诚然,上述描述仅仅是对基本时域编码的一个高度抽象性描述。可能仅与原始的
MPEG-1 水平相当。
累了,不写了。下回再更。