当前位置: 主页 > 处理视频 > 视频压制教程 > 进阶必读 视频压缩算法探讨(2)

进阶必读 视频压缩算法探讨(2)

2009-05-15   www.av110.net / 整理 点击: 标签:编码 算法 视频压缩
  

  编码

  压缩的下一个步骤即是对量化后的DCT系数进行比特编码,使之成为传输比特流,为了尽可能少的编码比特数,达到数据压缩的效果,需要利用量化后的DCT系数的一些统计特性。
  量化后的DCT系数的值大多是0值,特别是大量的高频DCT系数分量,一种叫做“游程编码”(以下称run-length编码)的技术可以很好的利用DCT系数的这一特点,在这种编码技术中,并不对每个0值系数单独编码,而是将连续的0值(run)进行打包,然后再对这些连续0值系数的个数(length)进行编码。

  为了更大程度的利用run-length编码的特点,需要对8x8系数矩阵进行zig-zag扫描,保证先对低频系数分量进行编码,然后再对高频系数分量进行编码,这样做的目的是因为在高频系数分量中出现大量连续0值系数的概率更高。

  Run-length编码完成后即进行变长编码(VLC),在变长编码中,每个可能出现的数据值作为一个符号(例如每种可能run-length值作为一个符号),出现概率大的符号值用比特数更少的码字表示,出现概率小的符号值用比特数更多的码字表示,变长码相对于定长码使用的比特数更少,(定长码是一种直接编码方法,例如直接将每个量化后DCT系数编码为其二进制表示),因此变长码在编码一幅图像时所消耗的平均比特数更少。在变长码编码中,哈夫曼编码是一种广泛使用的编码方法,基于每个符号的发生频率,哈夫曼编码可以获得更优的编码效果。

  理论上,对一组符号序列来说,变长编码并不是最优的编码方法,相对于变长编码来说,“算术编码”的编码比特数更少,编码效果更好。变长编码为每个符号分配单独的码字,因此每个符号都需要整数个比特个数(即每个符号至少占用1个比特),算术编码将一组符号序列作为一个整体来进行编码,因此并不是每个符号都需要占用比特,因此可以获得更大的压缩率,但是算术编码的运算法杂程度远远大于变长编码,因此只在最近的一些商用视频压缩算法中获得应用,相对于算术编码,在很多应用中,run-length编码和变长编码的组合编码方法相对于算术编码运算复杂程度低,编码效率足够,因此时至今日变长编码仍然在大量的视频压缩协议中广泛应用。

  变长编码通过对码字和其长度的查找表实现,完成查找后将码字取出填充进比特流输出,对应的解码端过程称之为变长解码(VLD),最直接的变长解码做法需要对每一个比特都要进行查表操作和判决,相对于变长编码对每一个符号所进行的查表操作来说,这种变长解码的方法运算量更加密集,平均每个比特需要进行11步操作,因此变长解码的处理性能需求是和解码器的解码码率成正比的,对于一些低分辨率和低码率的视频序列来说,变长解码往往占到整个解码器应用时处理器性能的25%。

  在一个典型的视频解码器中,上文所描述的这种最直接的变长解码方法需要占用数KB大小的存储空间用于存放查找表,为了获得更高的解码性能,可以采用一次处理一批比特的做法,当然,这种做法需要付出更大存储空间的代价。

  变长编码的缺点在于,当编码后的图像或者编码后视频帧的比特流中出现误码时,解码端将无法正确恢复误码后的图像部分,一旦出现误码,解码端就无法识别误码所对应的正确码字的长度,因此也就无法识别下一个正确码字在比特流里的起始位置,也就无法继续解码图像。一种技术可以部分解决这个问题,该技术在编码比特流中预先插入“重同步标志”,重同步标志的插入位置和内容是事先定义好的,因此解码端在解码过程中能够对重同步标志进行正确定位,因此当误码发生的时候,解码器可以从误码位置向后搜索下一个重同步标志,然后可以从这个重同步标志以后解码出后续的图像部分。

  此外,在MEPG4视频压缩标准中,还采用了称为“反向变长码”的技术,在反向变长码中,码字的选择保证了其不但能够从普通的正向进行解码,同时也能够从反向进行解码,因此当误码发生的时候,解码端可以向下搜索下一个重同步标志,搜索到了以后,再从重同步标志的位置反向解码至误码位置,因此解码端能够尽可能多的恢复图像数据。

  到此为止,上面描述的所有技术都是针对一个独立的8x8的像素块,一幅图像所包含的信息远大于一个8x8像素块所能包含的信息,因此利用相邻块彼此的相关性可以应用更多更有效的压缩方法。

  为了利用块与块之间的相关性,可以采用预测的技术,编码器在对DCT系数进行量化之前,可以基于周边块的DCT系数预测当前块的DCT系数,然后对预测值和当前实际值的差值进行量化,而不是直接对当前DCT系数进行量化,由于这个差值往往比较小,因此这项技术可以减少对DCT系数编码的比特数,对于解码端,采用相同的预测方法,然后将从码流解码出来的差值加上预测出来的预测值,就可以重构出实际的DCT系数值,需要注意的是,由于解码端只能够获得那些在当前块解码前已经解码的块的DCT系数,因此编码端必须保证只用到那些在编码当前块之前已经编码的块的DCT系数作为预测值。

  对于最简单的情况,只对每个块的第一个系数进行预测,这个系数被称作“DC系数”,它代表DCT系数里的最低频分量,等于所有块像素的均值,其余的系数被称作“AC系数”。这种最简单的做法是基于这样的假设,即当前块的DC系数等于左边相邻块的DC系数,这种做法利用了当前块和左边相邻块的空间相关性,对当前块和前一编码块的DC系数的差值进行编码,被称为“DC系数差分编码”,在JPEG图像压缩标准中得到了广泛的应用。

  也有一些更为复杂的预测方法,例如对8x8块的每一行和每一列的第一个DCT系数进行预测,这样的方法被称作“AC-DC预测”,同上面所描述的差分编码的方法相比,这种方法采用了更为复杂的预测方法,首先,对预测值的计算采用了滤波的方法,而不是简单的等于相邻块对应的系数,其次,预测值的产生可能要考虑多个相邻块,预测值可能是基于多个块预测值的组合,同样,编码器会从多个预测块中选出一个来获得最好的预测效果,这样的话编码器就必须在码流中表明哪一个相邻块被选中,这样解码器才能够进行同样的预测过程正确重构DCT系数。

关于色彩

 

  彩色图像通常用几个“色彩层”来呈现。例如,RGB彩色图像包含红色层、绿色层和蓝色层。每一个层包含单一色彩(红色、绿色或蓝色)的整个图像。当这三层重叠或混合后,将组成全彩图。为将彩色图像进行压缩,本文描述的静态图像压缩方法将依次应用到每个色彩层。

 

  视频压缩应用通常使用一种色彩层不对应特定色彩的色彩方案。通常是,一个色彩层包含亮度信息(彩色图像中每个像素的总亮度),两个层包含色彩(色度)信息,色度信息与亮度信息结合起来可以得到每个图像像素特定红、绿和蓝色彩。

 

  这样的色彩方案非常方便,因为人眼对亮度比对色度更敏感,因此色度层的编码和存储图像分辨率都比亮度信息更低。特别是视频压缩算法通常对色度层的垂直和水平编码的分辨率都仅为亮度层的一半。因此,在亮度层中的每个16 x16像素区域内,每个色度层包含一个8x8像素的块。在典型的视频压缩算法中,“宏块”为视频帧中的一个16x16像素的区域,该宏块包含4个8x8亮度块,以及两个对应的8x8色度块。宏块允许采用后面介绍的运动估计和补偿,这两个技术将与上面介绍的色度层次采样结合使用。

顶一下
(2)
100%
踩一下
(0)
0%
栏目热点
  • MeGUI压制使用说明书 MeGUI压制使用说明书 MeGUI 压制使用说明书 绪论: 视频压制的概念 一些尚未入门的爱好者常常会把视频压制与视频转换混为一谈。视频压制是一种入门比较简单,但深入有点深奥的视频压缩技术,用
精彩推荐