1.2 视频编码压缩原理及主流算法
视频编解码已经发展成为一个巨大的产业,同时产生了了多种算法标准。国际上起草视频标准的主要有国际标准化组织ISO(International Organization for Standardization)和国际电信联盟ITU(International Telecommunication Union)两大组织,他们制定了多种应用成功的视频编码压缩标准协议。如ISO的MPEG-1(VCD)、MPEG-2(DVD、DVB)、MPEG-4/7/21等标准,ITU的H.261/H.263标准,ISO的MPEG小组和ITU的VCEG小组合作成立的联合视频编码组JVT(Joint Video Team)制定了H.264/AVC标准。MPEG-4视频编码的应用较为普及,H.264视频标准的开发较为广泛。国内的AVS(Audio and Video coding Standard)编码效率与H.264标准相当,但复杂度版权费较低。相对来说,MPEG-4的开发和应用较成熟,H.264是目前研发和市场关注的热点,AVS的吸引力相比H.264较弱。因此目前主流的视频编解码算法标准是MPEG-4和H.264。因此,本书针对MPEG-4/H.264视频编码技术以工程实践的角度讲解相关的技术。
1.2.1 视频编码压缩原理
当前的大部分视频编码算法,包括MPEG-4/H.264以及AVS等,其工作机制均是混合编码,处理模块主要包含:预测、运动估计、变换、量化和熵编码等。不同的视频算法是前述各模块的不同实现方法,而工作原理大同小异。总体来看,图像帧的编码模式主要有帧内和帧间两种方式。帧内编码又包括预测、变换、量化和熵编码等,帧间编码包括运动估计、运动补偿、变换、量化和熵编码等。帧内预测和帧间运动估计统称预测编码。
预测编码是视频编码的最主要方法,简单而有效。编码理论和实际均已表明,图像的当前像素点与帧内相邻的上、下、左、右等位置的像点相比,灰度值变化很小,相关性极强,即图像存在空间冗余。视频帧是活动的图像序列,每秒含有多帧图像(要求不低于25f/s),当前图像点(块)与前、后帧的对应位置或附近的图像点(块)非常相似,相关性也很强,即序列图像存在时间冗余。预测编码就是减少上述的空间冗余和时间冗余,并分别对应帧内编码和帧间编码。
视频编码压缩的一般工作原理可用图1-1来说明,其中K表明帧内或帧间编码的开关。下面分别对上述功能模块进行逐一介绍。
图1-1 视频编码压缩原理图
1.帧内预测编码
帧内预测编码是对图像数据本身作编码,如静态图像编码、I帧(或关键帧Key Frame)编码都是帧内编码。由于空间像素值不会突变,则我们在处理当前图像块时,可以以先前已编解码的图像作参考,则参差的零值或较小的值会很多,起到了编码压缩的目的。帧内编码的优点是错误累积少、图像清晰,缺点是压缩倍率较小。在视频编码中,关键帧即I帧的间隔分固定和自动两种方式,固定间隔如25f/s × 10s=250帧,即每隔10秒出现一个I帧的帧内编码;自动间隔即编码系统的码率控制器根据设定的码流阈值及宏块的SAD值综合判断。图1-2是帧内预测编解码原理图。
图1-2 帧内预测编解码原理图
上图中的f(x,y)为当前像素值,(x,y)为像素点水平和垂直坐标。其预测值可以由当前位置(x, )y的相邻像素预测得到:
ak ,l为预测系数,Z为预测区域,(k,l)分别为对当前点进行预测的像素点的水平和垂直位置坐标。e(x,y)是当前像素值和预测值的差值,差值经过量化、编码形成最后的码流。用户可以发现量化器置于预测环路之内,量化误差被反馈回环路,从而使残存的量化误差减小。
上面是帧内预测编码的原理,但是视频编码的预测是对变换、量化后的系数做预测的,并且根据不同的视频压缩算法标准,预测的方式也有多种。如MPEG-1/2/4标准的帧内预测是利用当前块的上方、左方、斜上方等已编码块的第一行或第一列,来预测当前块的第一行和第一列,同时除去第一个直流分量;而H.264标准的帧内预测则根据块的大小,16×16亮度块有4种预测模式,4×4亮度块有9种预测模式,8×8亮度块有4种预测模式。预测值和当前值相减,得到预测残差,然后代替当前系数值,从而增加零值和较小值的概率,达到一定的压缩效果。但是,如果图像细节丰富,帧内预测编码效率往往并不高。
2.帧间预测编码
帧间预测编码是视频编码的主要方法,帧间编码即P帧(前向预测)编码、B帧(双向预测)编码。帧间的预测不是在当前图像帧内,而是在已编码重建帧的对应位置,或其周围作预测、搜索。因为帧间预测是图像在时间先后上的视频帧处理,所以又非常像一个物体在运动,体现在各个视频帧中。帧间预测就是在一定窗口内搜索到最佳匹配宏块,然后这两个宏块相减得到预测残差。
由于物体的实际运动轨迹并不是整数像素大小,为了更精确描述物体的运动轨迹,视频算法提出了1/2像素、1/4像素、1/8像素的运动估计,则此时得到的匹配块和运动矢量就相对更准确。另外由于物体如果快速运动,那么在一定的窗口内则无法收集到最佳匹配块和最真实运动矢量。但是,算法若在整个重建帧内搜索,计算量剧增,从而使算法不实用。这里主要介绍P帧的1/2像素菱形运动估计、插值补偿的帧间预测。其他更高分数精度像素和复杂运动估计算法,可参阅相关资料。
(1)帧间预测基本原理
基本原理框图如图1-3所示。当前帧图像ft(x,y)与预测图像相减后的帧误差et(x,y),经量化器量化后输出,进行熵编码。预测图像)与相加,得,当不计量化失真时,即当前的ft(x,y)。把当前帧与帧存储器输出的前一帧ft-1(x,y)(也称重建参考帧)同时输入运动参数估值器,经搜索、比较得到运动矢量MV(Motion Vector)。此MV输入运动补偿预测器,得到预测图像。
图1-3 前向预测编码
预测图像不可能完全等同于当前图像ft(x,y),无论预测得如何精确,总存在帧误差et(x,y)。由上述可知,利用上一帧的图像经运动矢量位移作为预测值的方法称为单向预测,则:
其中,(i,j)即为当前宏块的运动矢量。预测图像与当前图像对应相减得到残差,对残差作熵编码,同时编码运动矢量。
(2)重建图像的插值
连续运动的物体,其轨迹是连续的,而像素是离散的。所以只用整数像素来表示运动物体显然是不准确的,因此有非整数像素运动轨迹之称。对于前向预测编码的参考帧而言,只有重建参考帧,就需要在此参考帧的基础上插值出多帧非整数像素运动轨迹的参考帧。如1/2像素运动轨迹则有四个参考帧:重建参考帧、重建参考帧的水平插值参考帧、重建参考帧的垂直参考帧、重建参考帧的斜角参考帧。如MPEG-4算法中1/2像素插值用到的底层函数Interpolate16x16_halfpel_h、interpolate16x16_halfpel_v、interpolate16x16_halfpel_hv分别得到三个方向的插值参考帧。更高精度的插值则是前面较低精度的基础上继续在各个方向上插值。
(3)运动估计算法
在以上参考帧中对当前宏块搜索最佳匹配宏块,估计出最佳运动矢量大小。这里介绍的运动估计算法是基于块匹配的运动估值算法,即对当前编码宏块寻找最佳匹配图像宏块,同时就找到了最佳运动矢量mv(dx,dy)。运动估计的方法有多种,搜索的范围、大小也有多种;另外这里的最佳也是有限范围内的最佳,并且最佳准则也有多种。所以运动估计要解决两个问题:匹配准则和搜索算法。
① 匹配准则
常用的块匹配判断准则有平均绝对差(MAD)、差的绝对值的和(SAD),公式分别见(1-3.a)和(1-3.b)。
由于SAD只有乘加没有除法,所以SAD准则更为常用。如SAD值越小,表明这两个块越相似;MAD值的意义判断同SAD。
② 搜索算法
对当前预测编码图像的宏块在参考帧中,在一定窗口内,搜索判断,根据SAD准则在窗口限制范围内搜索最佳匹配宏块f(x,y)和运动矢量mv(dx,dy),运动估计原理图如图1-4所示。根据搜索的路径不同有多种运动估计算法。
图1-4 运动估计原理图
最简单的运动估计算法有三步搜索法、对数搜索法、四步搜索法,或者菱形搜索、大/小钻石搜索、六角形搜索等方法。
三步搜索算法如图1-5所示:每一步搜索9个位置点,搜索步长为3。对每一个位置计算MAD/SAD值,确定最小的失真方向,在最小失真方向上搜索区域减少一个搜索步长,下一步搜索新的9个位置点。直到搜索步长为1,此时的宏块即为用户认为的最佳匹配块,并记录当前运动矢量。
图1-5 三步搜索算法示意图
对数搜索法如图1-6所示:每一步搜索由区域中心位置和与中心相联的四个边缘点组成,连续搜索直到寻找的区域成为3×3矩形区域为止。最后一步计算3×3矩形区域的9个位置点,MAD/SAD为最小值时对应的宏块就是要寻找的最佳匹配块。
图1-6 对数搜索示意图
由于实际物体的运动千变万化,很难用一种简单的模型去描述,也很难用一种单一的算法来搜索最佳运动矢量,因此实际上大多采用多种搜索算法相组合的办法,可以在很大程度上提高预测的有效性和鲁棒性。如图1-7为H.264视频标准推荐的运动估计算法,全称是:非对称十字型多层次六边形格点运动搜索算法。
图1-7 H.264混合运动估计算法搜索示意图
H.264的运动估计算法利用了多种搜索方式。
第一步:非对称十字形搜索,水平搜索多于垂直方向;
第二步:正方形区域搜索;
第三步:中六边形模板、十字模板。
有时根据性能需求,简化该图,只采用部分搜索方式。经过实验证明对于中小运动序列,其速度可接近全局搜索算法的400倍,接近三步搜索算法的4倍;而对于大运动序列,该算法则会自动调节搜索点数以适应复杂的运动。
(4)运动补偿插值
根据匹配准则得到最佳匹配宏块及其运动矢量,作减运算得到残差。在计算残差时,需要根据运动矢量和参考帧类型作插值补偿,即在参考帧中,对应宏块位置偏移运动矢量大小得到匹配宏块,然后根据运动矢量选择插值帧:水平插值、垂直插值、斜角插值,最后做减法运算,完成运动补偿。
事实上,在进行运动估计时也并不是单一使用上述某一类搜索算法,而是根据各类算法的优点灵活组合。在运动幅度比较大的情况下可以采用自适应的菱形搜索法和六边形搜索法,这样可以大大节省码率而图像质量并未有所下降。在运动图像非常复杂的情况下,采用全局搜索法,在比特数相对来说增加不多的情况下,可使图像质量得到保证。
3.变换编码
变换编码是把时域或空域的信号通过数学工具转换到另外一个域内,而在这个新域中,信号的能量重新分布,且能量更集中,从而便于编码压缩。根据统计和经验得知:平坦区域或内容缓慢变化区域占据一幅图像的绝大部分,而细节区域或内容突变区域则占小部分。也可以说,图像中直流和低频分量占大部分,高频分量占小部分。这样,空间域的图像变换到频域,即所谓的变换域,会产生相关性很小的一些变换系数,并可对其进行压缩编码。视频编码中变换编码的数据源,包括两种:一是图像数据本身,二是图像残差。
变换中的正交变换,可用于图像编码。自1968年利用快速傅立叶变换(FFT)进行图像编码以来,出现了多种正交变换编码方法,如K-L变换、离散余弦变换(DCT)、小波变换等等。其中,编码性能以K-L变换最理想,但缺乏快速算法,且变换矩阵随图像而异,不同图像需计算不同的变换矩阵,因而只用来作参考比较。DCT编码性能略逊组最接近于K-L变换,具有快速算法,广泛应用于图像编码,如MPEG-1/2/4、H.261/263的浮点DCT变换和H.264中的整数DCT变换。JPEG采用了DCT变换,JPEG2000采用了小波变换。视频算法中的DCT原理如下表示,其中f(x,y)为N×N数字图像序列,DCT和IDCT变换核如下公式所示。
二维DCT变换表示为:
二维IDCT变换表示为:
c (u)和c(v)同式(1-5),其中x,y=0,1,...N-1。
DCT和IDCT也可写成矩阵形式:
对图像做变换编码,最理想的变换运算应对整个图像进行,以便去除所有像素间的相关性。但这样的操作计算量太大,需要的临时存储区太大。实际上,往往把图像分为一定大小的若干块,如16×16的宏块,然后以宏块为单位进行DCT变换。视频算法中通常为16×16或8×8的宏块。但是也正因为是以宏块为处理单位,经编解码后的图像有明显的块效应,这就需要用户在解码低码流的视频时增加后处理以提高图像质量。H.264视频编码算法就在编码内部及解码端开启了环路滤波功能,提高参考帧或解码帧的图像质量。
传统的DCT不是完全可逆的,所以解码出的图像有“拖尾效应”及误差积累,即I帧间隔不能太大,否则DCT的不可逆操作IDCT会产生更多的图像误差积累。H.264提供了整数DCT/IDCT,其反变换是完全可逆的。H.264图像在同码流下,明显优于其他以往标准算法,很重要的一个特点就是变换编码采用了整数DCT。
4.量化编码
量化编码是把DCT系数除以一个常量,经过量化后的结果是量化步长的整数倍或为更多的零值,从而达到了压缩的目的。如H.263的编码方式是16×16宏块的DCT系数除以同一个量化步长,即均匀量化;而MPEG的量化方式是采用量化矩阵的方法,即不同重要性的DCT系数除以不同的量化步长。在反量化时,由于量化过程取整或四舍五入,而无法完全恢复原DCT系数,从而产生失真。量化是视频编码失真的根本原因。量化的原理公式如(1-9)所示:
反量化的原理公式如(1-10)所示:
由于一般的可编程平台没有提供专用的除法指令,所以视频编码标准在量化与方量化的实际应用过程中,采用了查表或移位的方式来实现。如H.263的量化方式就是采用查表加移位的方式。量化步长越小,等级越多,则码流大小等级越丰富。如XviD的MPEG-4算法的H.263量化方式有32(0~31)个量化等级,而H.264有52(0~51)个量化等级。
5.之字形扫描
变换使空域的图像能量重新分布,主要集中在左上角。右下方大部分是较小值或零值。为了把左上方重要的非零值按照一维顺序串联起来,需要把变换后的系数按照一定的次序重新放置。采用“之”字形扫描方式就可以把图像块的这些非零值串接起来,从而把更多的零值丢弃。这样便于后续的熵编码。扫描过程如图1-8所示。
图1-8 之字形扫描
6.统计熵编码
经过变换、量化后,图像数据已经经过了一定程度的压缩。由上面的分析可知,图像的DCT量化系数的相关性较小,所有系数均重要,但数据的概率分布有一定规律。混合视频编码框架的最后一个模块熵编码,就是利用概率分布规律实现无损的统计编码的,其原理是:符号出现概率大的用短码字来表示,符号出现概率小的用长码字来表示,从而起到了数据压缩的目的,所以统计熵编码又称可变长编码VLC(Varaible Length Coding)。Huffman编码、算术编码等都是统计熵编码。实用的视频编码算法中,熵编码采用的是查表方式。MPEG1/2/4和H.261/263等采取的是Huffman编码,H.264中Baseline级的熵编码是上下文自适应的可变字长编码CAVLC,即改进的Huffman编码,H.264中的Main或Extended级的熵编码采取的是上下文自适应的二进制算术编码CABAC。
熵编码是针对图像或残差,而视频编码算法的其他信息如运动向量、直流分量、编码模式等控制信息的编码方式采用其他方法。如H.264中采取的是哥伦布编码(Golomb)。
熵编码是可逆编码,所以在视频编码算法框架中,视频数据的失真主要存在于变换、量化。如果变换可逆则只存在于量化。无损视频编码中,就是采用统计熵编码,如Huffyuv CODEC就是无损视频编解码算法的一个案例。
1.2.2 主流视频编码算法
上面简要介绍了视频编码压缩的一般工作原理,在实际开发和应用中,鉴于编码算法的高计算量和实现平台的运行特点,本书针对当下主流的视频编码压缩算法进行讲解。随着日益增长的视频压缩需求和巨大的市场潜力,视频编码算法标准一直在发展和完善中,笔者根据多年的视频编解码研发经验及相关技术文献的总结,认为目前主流的视频编码标准是MPEG-4和H.264。需要说明的是,虽然这两种视频编码的专用芯片已在监控系中统被较广泛的采纳,但本书关注的是基于可编程平台实现MPEG-4和H.264的视频编码压缩。
MPEG-4是ISO组织制定的音频编解码算法,主要针对网络、视频会议和可视电话等低码率传输应用。H.264是ITU-T和ISO联合组织JVT制定的视频编解码标准,在MPEG-4中是Part-10,称为AVC(Advanceel Video Coding),在ITU中称为H.264。所以H.264和AVC是同一个算法在不同组织中的不同名称。主要的视频算法发展历程如图1-9所示。
图1-9 视频编码算法的发展历程
下面分别介绍这两种视频算法的来源、应用和主要特点。后续章节主要以具体的开发平台、研发案例讲解算法流程、开发过程和技术要点等。
1.MPEG-4视频编解码算法
MPEG-4是由MPEG(Moving Picture Expert Group动态图像专家组)制定的一个ISO和IEC标准,该委员会曾经制定出获得艾美奖的标准——MPEG-1(VCD)和MPEG-2 (DVD)。这些标准使在CD-ROM和数字电视上制作交互视频成为可能。MPEG-4是国际组织和遍布世界的几百位研究者与工程师合作的成果。MPEG-4的标准号是ISO/IEC 14496,定稿于1998年10月,于1999年1月成为国际标准。完全向后兼容的MPEG-4第二版于1999年底定稿,于2000年初被正式接受为国际标准,有些细节仍在制定过程中。MPEG-4算法标准适应范围宽,档级多,从兼容传统的视频编码到高级的对象编码。视频对象编码是把视频场景按照对象目标进行分割,一般包括场景和场景的各个目标。对不同的目标对象选用不同的编码技术,从而达到系统、的高效的视频编码。但是由于视频对象分割目前仍然是个难点,还处于尚未成熟或研究阶段,MPEG-4的应用和开发仍然是基于像素的传统视频编码。只是把整个帧看做一个对象VOP(Video Object Plance),分别编码纹理信息(残差或图像本身)和运动信息(运动向量)。
MPEG-4是提供了大量丰富的音频视频对象的编码工具,能够满足多种应用需求。而对于某一特定的应用,只有一部分编码工具被采用,框架(Profile)就是针对特定的应用确定要采用的编码工具,它是MPEG-4提供的工具集的一个子集。每一个框架又有一个或多个级别(Level)来限制算法的复杂度。MPEG-4共有4类框架:视频框架、音频框架、图形框架和场景描述框架。其中视频框架又包含如下5个级别:
● Simple Visual Profile:提供矩形视频对象的高效、有容错能力的编码功能,适合应用于移动网络。
● Simple Scalable Visual Profile:在Simple Profile基础上增加了对象时域和空域扩展编码功能,应用于提供多级服务质量的应用,如Internet和软件解码。
● Core Visual Profile:在Simple Profile基础上增加了任意形状对象编码和时域扩展编码功能,适用于相对简单的内容交互应用,如Internet多媒体应用。
● Main Visual Profile:在Core Profile基础上增加了Sprite对象编码功能,适用于交互式应用和娱乐级别质量的视频广播和DVD应用等。
● N-Bit Visual Profile:在Core Profile基础上增加了具有不同像素深度(4~12bits)的视频对象编码功能,适用于监控应用。
MPEG-4之前的视频标准都是采用第一代压缩编码技术,基于图像信号的统计特性来设计编码器,属于波形编码的范畴。第一代压缩编码方案把视频序列按时间先后分为一系列帧,每一帧图像又分成宏块以进行预测、运动补偿和编码,这种编码方案存在以下缺陷:
● 将图像分成相同大小的块,高压缩比情况下会出现严重的块效应;
● 无法对视频内容进行访问、编辑和回放等操作;
● 未充分利用人类视觉系统HVS(Human Visual System)的特性。
MPEG-4代表了基于模型和对象的第二代压缩编码技术,它充分利用了人眼视觉特性,抓住了图像信息传输的本质,从轮廓、纹理思路出发,支持基于视觉内容的交互功能,这适应了多媒体信息的应用由播放型转向基于内容的访问、检索及操作的发展趋势。
MPEG-4除采用第一代视频编码的核心技术,如帧内预测、运动估计、变换量化及熵编码外,还提出了一些新的有创见性的关键技术,并在第一代视频编码技术基础上进行了卓有成效的完善和改进,下面重点介绍其中的一些关键技术。
(1)视频对象编码
MPEG-4实现基于内容操作的前提是把视频/图像分割成不同对象,或者把运动对象从背景中分离出来,然后针对不同对象采用相应的编码方法,以实现高效压缩。因此视频对象提取即视频对象分割,是MPEG-4视频编码的关键技术,也是新一代视频编码的研究热点和难点。视频对象分割涉及对视频内容的分析和理解,这与多种学科,人工智能、图像理解、模式识别和神经网络等有密切的联系。人工智能的发展还不够完善,计算机还不具有观察、识别、理解图像的能力;同时关于计算机视觉的研究也表明,要实现正确的图像分割需要在更高层次上对视频内容进行理解。因此,尽管MPEG-4框架已经制定,但至今仍没有通用的有效方法去根本解决视频对象分割的问题,视频对象分割已被公认为是一个具有挑战性的难题,基于语义的对象分割则更加困难。
(2)VOP视频编码
视频对象平面(VOP)是视频对象(VO)在某一时刻的采样,VOP是MPEG-4视频编码的核心概念。MPEG-4在编码过程中针对不同VO采用不同的编码策略,即对前景VO的压缩编码尽可能保留细节和平滑;对背景VO则采用高压缩率的编码策略,甚至不予传输而在解码端由其他背景拼接而成。这种基于对象的视频编码不仅克服了第一代视频编码中高压缩率编码所产生的方块效应,而且使用户可与场景交互,从而既提高了压缩比,又实现了基于内容的交互,为视频编码提供了广阔的发展空间。MPEG-4支持任意形状的图像与视频的编解码。
(3)视频编码可分级性
随着因特网业务的不断增多,在速率起伏很大的网络及具有不同传输特性的异构网络上进行视频传输的要求和应用越来越多。在这种背景下,视频分级编码的重要性日益突出,其应用非常广泛,且具有很高的理论研究及实际应用价值,因此受到人们的极大关注。视频编码的可分级性(Scalability)是指码率的可调整性,即视频数据只压缩一次,却能以多个帧率、空间分辨率或视频质量进行解码,从而可支持多种类型用户的各种不同应用要求。
MPEG-4通过视频对象层VOL(Video Object Layer)数据结构来实现分级编码。MPEG-4提供了两种基本分级工具,即时域分级(Temporal Scalability)和空域分级(Spatial Scalability),此外,还支持时域和空域的混合分级。每一种分级编码都至少有两层VOL,低层称为基本层,高层称为增强层。基本层提供了视频序列的基本信息,增强层提供了视频序列更高的分辨率和细节。
(4)运动估计与运动补偿
MPEG-4采用I-VOP、P-VOP、B-VOP三种帧格式来表示不同的视频编码类型。它采用了1/2、1/4像素搜索和重叠运动补偿技术,同时又引入重复填充技术和修改的块(多边形)匹配技术以支持任意形状的VOP区域。同时,为提高运动估计算法精度、降低算法运算量,MPEG-4采用MVFAST(Motion Vector Field Adaptive Search Technique)和改进的PMVFAST(Predictive MVFAST)方法用于运动估计。对于全局运动估计,则采用了基于特征的快速稳健的FFRGMET(Feature-based Fast and Robust Global Motion Estimation Technique)方法。
MPEG-4视频编码算法中,运动估计模块最耗时,对编码的实时性影响最大,因此实际应用开发时强调快速算法。运动估计方法主要有像素递归和块匹配法两大类,前者复杂度很高,实际中应用较少,后者则在H.263和MPEG中被广泛采用。在块匹配法中,重点研究块匹配准则及搜索方法。
在选取匹配准则后,就应进行寻找最优匹配点的搜索工作。最简单、最可靠的方法是全搜索法(FS,Full Search),但计算量太大,不便于实时实现。因此快速搜索法应运而生,主要包括三步搜索法、二维对数法和钻石搜索法,其中钻石搜索法被MPEG-4校验模型VM(Verification Model)所采纳。钻石搜索法DS(Diamond Search)以搜索模板形状而得名,具有简单、鲁棒、高效的特点,是现有性能最优的快速搜索算法之一。其基本思想是利用搜索模板的形状和大小对运动估计算法速度及精度产生重要影响。在搜索最优匹配点时,选择小的搜索模板可能会出现局部最优,选择大的搜索模板则可能无法找到最优点。因此DS算法针对视频图像中运动矢量的基本规律,选用了两种形状大小的搜索模板。大钻石搜索模板LDSP(Large Diamond Search Pattern)和小钻石搜索模板SDSP(Small Diamond Search Pattern)。
2.H.264视频编解码算法
H.264是联合视频组JVT开发的一个新的数字视频编码标准,它既是ITU-T的H.264算法,又是ISO/IEC的MPEG-4的第10部分。1998年1月份开始征集H.264算法草案, 1999年9月完成第一个草案,2001年5月制定了其测试模式TML-8,2002年6月JVT第5次会议通过了H.264的FCD版,2003年5月,ITU正式核准颁布。
H.264算法还是基于块的混合编码技术,编码过程基本与以前的编码标准相同,只是每个功能模块都进行了技术更新,帧内预测、帧间预测、整数DCT变换、环路滤波、熵编码等模块都做了技术提升。
(1)NAL与VCL
网络适配层NAL(Network Abstraction Layer)是H.264为适应网络传输应用而制定的一层数据打包操作。传统的视频编码算法编完的视频码流在任何应用领域下(无论用于存储、传输等)都是统一的码流模式,视频码流仅有视频编码层VCL(Video Coding Layer)。而H.264可根据不同应用增加不同的NAL片头,以适应不同的网络应用环境,减少码流的传输差错。
(2)帧内预测
H.264为能进一步利用图像的空间相关性,H.264引入了多模式的帧内预测以提高压缩效率。简单地说,帧内预测编码就是用周围邻近的像素值来预测当前的像素值,然后对预测误差进行编码。预测是基于块的,亮度分量(Luma)块的大小可以在16×16和4×4之间选择,16×16块有4种预测模式,4×4块有9种预测模式;色度分量(Chroma)预测是对整个8×8块进行的,预测模式同亮度16×16的4种预测模式。
(3)帧间预测
帧间预测即传统的运动估计ME加运动补偿MC,H.264的运动估计更精准、快速,效果更好。
1)多变的宏块大小
传统的运动估计块大小是16×16,由于运动物体复杂多变,仅使用一种模式效果不好。H.264采用了7种方式对一个宏块进行分割,分别为16×16、16×8、8×16、8×8、8×4、4×8、4×4,每种方式下块的大小和形状都不相同,这就使编码器可以根据图像的内容选择最好的预测模式。实验表明,与仅使用16×16块进行预测相比,使用不同大小和形状的块可以使码率节省15%以上。
2)更精细的像素精度
在H.264算法中,Luma分量的运动矢量MV使用1/4像素精度。Chroma分量的MV由Luma MV导出,由于Chroma分辨率是Luma的一半(YUV4:2:0),所以其MV精度将为1/8。如此精细的预测精度较之整数精度可以使码率节省超过20%。
3)更多参考帧
H.264支持多参考帧预测(Multiple Reference Frames),即可以有多于1个(最多5个)的在当前帧之前解码重建的帧,作为参考帧产生对当前帧的预测(Motion-compensated Prediction)。这特别适用于视频序列中含有周期性运动的情况。
4)环路滤波
环路滤波(Loop Filter)的作用是,消除经反量化和反变换后重建图像中由于预测误差产生的块效应,从而一方面改善图像的主观质量,另一方面减少预测误差。与以往的Deblocking Filter不同的是,经过滤波后的图像将根据需要放在缓存中用于帧间预测,而不是仅仅在输出重建图像时用来改善主观质量,也就是说该滤波器位于解码环中,而非解码环的输出外,因而得名Loop Filter。
(4)整数DCT变换
传统的DCT是由浮点算法定点实现,所以IDCT不是可逆的,容易造成解码图像的周围“拖尾”现象。H.264对帧内或帧间预测的残差(Residual)进行整数DCT变换编码。新标准对DCT的定义做了修改,使得变换仅用整数加减法和移位操作即可实现,这样在不考虑量化影响的情况下,解码端的输出可以准确地恢复编码端的输入。此外,该变换是针对4×4块进行的,这也有助于减少块效应。为了进一步利用图像的空间相关性,在对色度(Chroma)的预测残差和16×16帧内预测的预测残差进行上述整数DCT变换之后,标准还将每个4×4变换系数块中的DC系数组成2×2或4×4大小的块,进一步做哈达玛(Hadamard)变换。
(5)熵编码
对于预测残差,H.264有两种熵编码的方式:基于上下文的自适应变长码CAVLC (Context-based Adaptive Variable Length Coding)和基于上下文的自适应二进制算术编码CABAC(Context-based Adaptive Binary Arithmetic Coding);如果待编码的数据不是预测残差这一类型,则H.264采用Exp-Golomb码或CABAC来编码,具体选用哪种编码类型视编码器的设置而定。
1)CAVLC
可变字长编码VLC的基本思想就是,对出现频率大的符号使用较短的码字,而出现频率小的符号采用较长的码字,这样可以使平均码长最小。在CAVLC中,H.264采用若干VLC码表,不同的码表对应不同的概率模型。编码器能够根据上下文,如周围块的非零系数或系数的绝对值大小,在这些码表中自动地选择,最大可能地与当前数据的概率模型匹配,从而实现了上下文自适应的功能。
2)CABAC
算术编码是一种高效的熵编码方案,其每个符号所对应的码长被认为是分数。由于每一个符号的编码都与以前编码的结果有关,所以它考虑的是信源符号序列整体的概率特性,而不是单个符号的概率特性,因而它能够更大程度地逼近信源的极限熵,极大的降低码率。