1.视频编码基本原理
(1) 视频信号的冗余信息
以记录数字视频的YUV分量格式为例,YUV分别代表亮度与两个色差信号 。例如对于现有的PAL制电视系统,其亮度信号采样频率为13.5MHz;色度信号的频带通常为亮度信号的一半或更少,为6.75MHz或3.375MHz 。以4:2:2的采样频率为例,Y信号采用13.5MHz,色度信号U和V采用6.75MHz采样,采样信号以8bit量化,则可以计算出数字视频的码率为:
13.5*8 + 6.75*8 + 6.75*8= 216Mbit/s
如此大的数据量如果直接进行存储或传输将会遇到很大困难,因此必须采用压缩技术以减少码率 。数字化后的视频信号能进行压缩主要依据两个基本条件:
l 数据冗余 。例如如空间冗余、时间冗余、结构冗余、信息熵冗余等,即图像的各像素之间存在着很强的相关性 。消除这些冗余并不会导致信息损失,属于无损压缩 。
l 视觉冗余 。人眼的一些特性比如亮度辨别阈值,视觉阈值,对亮度和色度的敏感度不同,使得在编码的时候引入适量的误差,也不会被察觉出来 。可以利用人眼的视觉特性,以一定的客观失真换取数据压缩 。这种压缩属于有损压缩 。
数字视频信号的压缩正是基于上述两种条件,使得视频数据量得以极大的压缩,有利于传输和存储 。一般的数字视频压缩编码方法都是混合编码,即将变换编码,运动估计和运动补偿,以及熵编码三种方式相结合来进行压缩编码 。通常使用变换编码来消去除图像的帧内冗余,用运动估计和运动补偿来去除图像的帧间冗余,用熵编码来进一步提高压缩的效率 。下文简单介绍这三种压缩编码方法 。
(2) 压缩编码的方法
(a) 变换编码
变换编码的作用是将空间域描述的图像信号变换到频率域,然后对变换后的系数进行编码处理 。一般来说,图像在空间上具有较强的相关性,变换到频率域可以实现去相关和能量集中 。常用的正交变换有离散傅里叶变换,离散余弦变换等等 。数字视频压缩过程中应用广泛的是离散余弦变换 。
离散余弦变换简称为DCT变换 。它可以将L*L的图像块从空间域变换为频率域 。所以,在基于DCT的图像压缩编码过程中,首先需要将图像分成互不重叠的图像块 。假设一帧图像的大小为1280*720,首先将其以网格状的形式分成160*90个尺寸为8*8的彼此没有重叠的图像块,接下来才能对每个图像块进行DCT变换 。
经过分块以后,每个8*8点的图像块被送入DCT编码器,将8*8的图像块从空间域变换为频率域 。下图给出一个实际8*8的图像块例子,图中的数字代表了每个像素的亮度值 。从图上可以看出,在这个图像块中各个像素亮度值比较均匀,特别是相邻像素亮度值变化不是很大,说明图像信号具有很强的相关性 。

文章插图
下图是上图中图像块经过DCT变换后的结果 。从图中可以看出经过DCT变换后,左上角的低频系数集中了大量能量,而右下角的高频系数上的能量很小 。

文章插图
信号经过DCT变换后需要进行量化 。由于人的眼睛对图像的低频特性比如物体的总体亮度之类的信息很敏感,而对图像中的高频细节信息不敏感,因此在传送过程中可以少传或不传送高频信息,只传送低频部分 。量化过程通过对低频区的系数进行细量化,高频区的系数进行粗量化,去除了人眼不敏感的高频信息,从而降低信息传送量 。因此,量化是一个有损压缩的过程,而且是视频压缩编码中质量损伤的主要原因 。
量化的过程可以用下面的公式表示:

文章插图
其中FQ(u,v)表示经过量化后的DCT系数;F(u,v)表示量化前的DCT系数;Q(u,v)表示量化加权矩阵;q表示量化步长;round表示归整,即将输出的值取为与之最接近的整数值 。
合理选择量化系数,对变换后的图像块进行量化后的结果如图所示 。

文章插图
DCT系数经过量化之后大部分经变为0,而只有很少一部分系数为非零值,此时只需将这些非0值进行压缩编码即可 。
(b) 熵编码
熵编码是因编码后的平均码长接近信源熵值而得名 。熵编码多用可变字长编码(VLC,Variable Length Coding)实现 。其基本原理是对信源中出现概率大的符号赋予短码,对于出现概率小的符号赋予长码,从而在统计上获得较短的平均码长 。可变字长编码通常有霍夫曼编码、算术编码、游程编码等 。其中游程编码是一种十分简单的压缩方法,它的压缩效率不高,但编码、解码速度快,仍被得到广泛的应用,特别在变换编码之后使用游程编码,有很好的效果 。
推荐阅读
- 超级简单的数据压缩算法—LZW算法
- Python 编码风格指南
- 视频压缩转换,如何做到1G视频压缩到30M不失真?
- 详解冰箱压缩机工作原理 电冰箱压缩机
- Mac视频与音频格式转换工具
- 邮政编码6位数代表什么意思? 邮编是什么呢
- Linux中zip压缩和unzip解压缩命令详解
- 带你彻底搞明白python3编码原理
- 零基础,史上最通俗视频编码技术入门
- Web前端开发应该必备的编码原则
