一种提高视频压缩速度的改进算法
2008-07-17
作者:江加加,杨成忠,周 韵
摘 要: 分析了噪声对视频图像压缩速度的影响及传统去噪" title="去噪">去噪方法的性能缺陷,提出了使用二次残差算法来改进由于噪声引起误判的思想,以提高压缩速度。实验结果说明,该方法能有效地减少由噪声带来的误判,在压缩速度上也较传统方法有一定的改善。
关键词: 视频图像 压缩速度 残差算法
随着全世界安防事业的迅猛发展,视频监控" title="视频监控">视频监控系统的应用越来越广泛,视频卡的需求也随之增加。由于原始视频数据量很大,直接对其进行存储与传输实现起来比较困难。故在保证图像质量的前提下,减少图像的数量,提高压缩速度将成为研究的重点。
视频图像之所以可以被压缩,是因为它们存在着很多数据冗余[1]:视觉冗余、空间冗余、时间冗余以及编码冗余[2-3]。在视频压缩过程中,最重要的是减少视频的时间冗余,即同一像素点在不同时刻具有很大的相关性,称为时间上的冗余。由于视频是一系列的图像序列,很多时候前一帧与后一帧的差别并不大,如果每一帧图像都传送将会存在很多冗余。故对有运动的块进行编码传输,忽略没有运动的块,就可以达到比较高的压缩比率。
在判断宏块" title="宏块">宏块是否有运动的时候,通常采用残差计算,当结果超过阈值时就进行后续运算编码。但是在视频监控中的视频压缩与通常的影片视频压缩有很大的不同,在实际使用中会有很多图像噪声。而噪声的引入会对判断宏块是否有运动造成影响,增加了许多额外的运动向量估计,减缓了压缩速度。本文针对如何减少图像噪声带来的影响,提出了一种改进的残差计算方法,有效地优化了视频压缩速度。
1 残差算法改进的原因
1.1 图像的噪声
在视频监控系统中,摄像头中的CCD感光器件将光信号转换成电信号形成了图像信号,但是在这个过程中却不可避免地引发了噪声问题。图像中的噪点一般是由CCD噪声形成的,主要有散粒噪声、暗电流噪声、转移噪声。当CCD在低光照、低反差下应用时,散粒噪声成为主要的噪声源,它是CCD敏感器件所固有的噪声,不能被后续电路所抑制或抵消[4]。因此,在视频监控实际使用过程中,图像的噪点主要是由CCD形成的散粒噪声所引起的。
图像去除白噪声" title="白噪声">白噪声的方法已经有很多经典的算法,如平均滤波、中值滤波以及频域滤波等。但是传统的去噪方法不能完全适用,主要原因:(1)去噪算法本身需要增加很多运算量,因此很难加快压缩速度。(2)由于白噪声的随机性,即使运用去噪算法,后两帧所得的结果不会一致,还是会造成前后帧的残差过大。(3)对于需要传输的图像或者图像的某一部分,压缩算法都会进行离散余弦变换DCT(Discrete Cosine Transform),并且对高频分量的量化步长会比较大,这也将影响图像的去噪效果。
因此传统的去噪方法不会提高视频压缩的速度,故达不到所要求的目的。
1.2 残差算法
在视频压缩的过程中,最重要的工作是消除时间上的冗余性,即尽量去除帧与帧之间的冗余。对于XVID编码格式,帧分成VOP_I与VOP_P。VOP_I采用帧间编码模式,VOP_P采用帧内编码模式。帧内编码采用的是类似于JPEG压缩算法即将一帧图像传输过去,而帧间编码是将两帧之间的差值传送过去。在帧间编码的过程中,首先对图像分成16×16的宏块,然后判断该宏块是否相对于前一帧运动,如果没有运动,则设置成SKIP模式不进行编码;如果视频能够尽可能地使用帧间编码方式,同时又有许多的宏块是SKIP模式的,则可以不进行最为耗时的运动估计算法" title="估计算法">估计算法,而视频流将会比较小,编码的速度也会大大增加。
在帧间编码方式上,判断一帧图像是否有运动,需要将其编码成SKIP模式,主要是与前一帧图像进行如下残差计算:
由前面的分析可知,图像的噪点主要是由散粒噪声所引起的,特别是在光线不足的情况下噪点越发明显。由于噪点的引入使得原本没有变化的两帧图像计算得到的残差SAD很大,超过了判断阈值,被误判为运动块,进行了非常耗时的DCT或者运动向量估计算法,造成了视频压缩速度的降低以及传输码流的增大。为此,提出了对SAD残差算法的改进。
2 残差SAD算法的改进
由于噪点的引入,使得原有SAD算法判断图像运动与否的过程出现了很多误判,为了减少这种误判提出了对原有SAD算法的改进,增加了二次残差判断SAD′。二次计算残差的SAD′算法如下:
式(2)与式(1)原有的SAD相比只是将取绝对值放到了对所有点残差求和之后。其实验结果:两帧没有变化的图像如图1所示,将图1中图像的每个像素相减求差后得到结果如图2所示。
由图2可以看出,差值基本符合白噪声的规律。SAD算法是将每个差值取绝对值后累加得到的SAD(MBM×N),其值将远远大于运动阈值。而在本文提出的改进SAD′算法中是将每个差值直接累加后取绝对值。由于白噪声的统计特性,所得到的结果SAD′(MBM×N)非常接近于0。即式(2)可以等效于式(3)。
式中,Y(x,y)为当前帧图像,Ypre(x,y)为前一帧图像,N(x,y)为当前帧散粒噪声,Npre(x,y)为前一帧散粒噪声。由于图像未运动Y(x,y)=Ypre(x,y),又因为白噪声的统计特性因此SAD′(MBM×N)理论值为0,与实验结果相吻合。
在运算残差过程中,如果SAD值大大超过阈值,则需要进行二次阈值判断SAD′;如果是噪声引起的残差值,则可以很有效地避免误判,而不需要进行耗时的运动向量估计算法。
3 改进残差算法的应用
本文选用MPGE-4编码器作为视频编码器,并采用源码开发的XVID压缩格式。为了提高压缩速度,选用XVID中的single pass编码方式[5]。
3.1 MPGE-4编码器工作流程
首先判断采用帧内编码模式还是帧间编码模式,即判断是否对整一幅图像进行编码还是对某些部分进行编码。若采用帧内编码其原理如JPEG算法;若采用帧间编码,则需要将图像分块判断该块是否运动,通过残差计算与前一帧图像进行比较。如果是静止块则设置成SKIP模式进行简单的处理;如果是运动块则进行运动向量估计。编码器的工作流程如图3所示。
3.2 二次残差算法的验证
在整个编码流程中有两处用到了残差算法:
(1)在判断是采用帧间编码还是帧内编码时调用了MEanalysis函数。MEanalysis的原理是:如果某个宏块的残差的sad大于该宏块的平均值的偏离,则使用intra方式;否则使用inter方式,然后对这些宏块进行统计,得到整帧的编码方式,即if(sSAD>IntraThresh2) return I_VOP;//IntraThresh=90。
(2)在采用帧间编码确定SKIP模块时,每个宏块调用sad16v计算本宏块与参考帧对应位置的宏块的亮度的残差,将其保存在相应的数组中;然后调用sad8两次,分别计算u分量和v分量的残差,也保存在相应的数组中。如果该宏块的量化差值为0,并且所记录的最大亮度块残差没有超过SKIP模式的阈值,则使用xvid_me_SkipDecisionP确认符合SKIP模式。即:
if(iSAD>=BFRAME_SKIP_THRESHHOLD?鄢pMB->quant)
{ bSkip=0;/?鄢could not SKIP?鄢/}//BFRAME_SKIP_THRESHHOLD=30
通过上述函数分析可知,在帧内编码模式和帧间编码的确定过程中,都是通过计算残差SAD得到的,而且在判断宏块是否为SKIP模式时还需要通过Y、U、V三次计算残差。
在本应用中将上述两个判断引入二次残差算法计算SAD′,同时加大了阈值门限IntraThresh和BFRAME_SKIP_THRESHHOLD(分别增加了10%),并分别设为99和33,并且在判断宏块是否为SKIP模式时只对亮度信号进行残差运算忽略色度信号,达到了一定效果。其编码器速度优化结果如表1所示。
表1是在低照度、分辨率为360×288的情况下得到的结果。从表中数据可以看出,改进以后压缩速度提高了40%以上,因此,在保证视频显示效果的同时,增加二次残差计算能够大大减少误判,可有效提高压缩速度。
在保证图像不失真的前提下,提高压缩速度是当前视频编码的热点问题。本文在原有残差算法的基础上,给出了一种适用于MPEG环境的二次残差算法。与传统算法相比,该方法可以更有效地避免由于噪声引起的运动块误判。应用表明,改进后的算法可以明显提高压缩速度,有效解决由CCD噪声引起的运动误判问题。
参考文献
[1] 薛文通,宋建社,袁礼海,等.图像压缩技术的现状与发展.计算机工程与应用,2003,(2).
[2] TORRES L,KUNT M.Video coding:the second generation approach[M].Englewood Cliffs,NJ:Kluwer,1996.
[3] SALEMBIER P,TORRES L,MEYER F,et al.Region-based video coding using mathematical morphology[J].Proc.IEEE,1995,83(6):843-857.
[4] 谢小权.低照度CCD图像采集及噪声预处理.电子技术应用,2000,26(8):11-12.
[5] 王文庆,毛文林,张利飞.基于MPEG-4的视频监控系统模型及实现.计算机工程,2006,(11).