视频编码系统的运动估计装置及其方法
技术领域
本发明涉及一种视频编码系统,具体涉及一种运动估计装置及其方法。
背景技术
二维的数字化图象序列通常用象素点的YuV三分量来表示,由于一幅图象的像素点数量非常多,需要大量的数据来表示,给图象的存储与传输带来很大的麻烦,这就需要对图象数据进行压缩,以减少其数据量。事实上,连续的图象序列在空间和时间上有着非常高的相关性,可以利用这一特性来消除数据冗余以获得有效的数据压缩。
消除空间冗余的方法是帧内预测,为编码一帧图象的某个区域,可以使用本帧图象内与该区域相邻部分的信息来预测。消除时间冗余信息的关键技术是运动补偿,它的思想是,相邻的两帧图象相似程度非常高,有些时候甚至是完全相同的,所以在编码后一帧图象的某一区域时,可以用前一帧图象的相似区域来预测,这样做的好处是,只需要存储或传输两个区域位置的相对偏移和插值信息即可,由于插值信息包含的信息量非常小,可以用很少的数据位来表示,所以可以取得很高的压缩效率。在现行的编解码框架中,一般采用块编码结构,编码的基本单位是16×16的像素块。据此,在编码当前帧的某个像素块时,需要在前一帧(又称为参考帧)中搜索匹配程度最高的象素块,这个过程称为运动估计。
运动估计的过程大致可以描述如下,对于当前帧的一个待编码块(在此称为目标块),需要在参考帧中找到一个最佳匹配块。考虑到图象的运动特性以及计算的复杂度,不需要对整个参考帧进行搜索,可以事先在参考帧中确定一个搜索窗口,只在搜索窗口中进行搜索。在运动估计过程中,评价一个参考块与目标块的匹配程度的标准是这两个块的绝对误差和(SAD:Sum of Absolute Difference)。
其中block为块的边长,一般为8或16,MBc(x,y)表示目标块中坐标(x,y)的象素值,MBr(x,y)表示参考块中坐标(x,y)的象素值。SAD运算是一种耗时(time consuming)运算。
找到最佳匹配的整像素参考块之后,为提高匹配精度,一般还需要在整像素点周围进行分像素搜索,所谓分像素搜索就是对整像素参考块进行二分之一甚至四分之一差值,以期望更大程度的消除冗余,求得更小的SAD,插值运算的耗时一般是SAD运算的几倍以上。
以搜索窗口为48×48大小,目标块为16×16大小,搜索精确为四分之一像素为例,最原始的搜索算法是全搜索,也就是对搜索窗口中所有可能的参考块进行搜索,为求得最佳整像素参考块,需要做32×32=984次SAD运算。为得到最佳分像素参考块,还需要对整像素点做5×5-1=24次插值运算和24次SAD运算。
为提高搜索效率,人们提出了各种快速搜索算法,这些算法利用图象的平滑特性,使用较小的SAD次数便可以得到搜索窗口中的局部最优点,以较小的性能损失换来了计算量的大量节省。常见的快速搜索算法有,二维对数搜索法,三步法,菱形搜索法,这些算法能将整像数搜索的SAD次数减少到平均15-20次,而且搜索精度保持在90%以上。
有关搜索的起始点的问题,最初的方法是在参考帧中与目标块在当前帧中有着相同坐标的参考块开始搜索,也就是坐标偏移为(0,0)的点开始。考虑到物体运动的连续性,前一帧中某物体运动的方向应当与当前帧中同一物体的运动方向相同,与此同时,在同一帧内部,位置相邻的两个块中的物体,由于块的大小很小,在大部分时候也有着相似的运动方向。所以,搜索的起始点可以通过本帧内相邻块的运动向量和上一帧中相同位置块的运动向量来预测,这也有助于提高搜索的效率。
我们知道,在便携式应用中,计算复杂度的大小是方案能否取得成功的关键,因为便携式处理器考虑到功耗,面积等因素,其处理能力一般都较弱,而对视频编码这种对计算量要求很高的应用,需要大量算法上和架构上的优化才能取得成功。
普通的快速搜索算法虽然能较大程度的减少搜索次数,但这对便携式应用还显不够。以菱形搜索为例,平均每个16×16的宏块需要10-15次SAD运算,和至少4次插值运算。每次SAD需要256次减法,256次求绝对值,255次累加。假设插值采用的是四抽头滤波器,那么每个插值点需要4次乘法,三次累加和一次移位运算,对两个方向均是分像素的二维插值,需要两倍于一维插值的运算量。据统计,一个16×16宏块的运动估计需要耗费通用处理器15000至25000个周期,以CIF(352×288)分辨率图象为例,以每秒30帧的速度编码,运动估计模块需要200M MIPS以上的运算量,再加上内部存储器的读写延迟,需要400-500M MIPS的运算量。这对便携式处理器来说无论在处理能力上还是在功耗上都是不能接受的。
此外,搜索窗口的数据从内部存储器到高速缓存之间的传输需要占用大量的总线带宽。以±16像素点的偏移极限为例,搜索窗口为(3×16)×(3×16)字节大小,再加上4抽头插值所需的额外3个像素点,共计52×52=2704字节大小。这样一来,对于CIF(352×288)大小的运动图像,每编码一帧需要传输2704×396=1.07兆字节的搜索窗口数据,以30帧每秒计算,约需要32M字节每秒的总线带宽。
专利CN 1440203A中提出的算法需要做一个全搜索,这对降低运算复杂度没有帮助;专利CN 1177483C中提出了预测运动向量搜索的方法,但其阈值是固定的,不能做到动态调整,因此也就不能有效减少整像素和分像素搜索的次数。
发明内容
运动估计是编码器的关键算法,即使采用现有快速搜索算法,仍然需要耗费200M MIPS以上(CIF 30帧每秒的图像),这对通用型便携式处理器来说,是无法承受的。此外,搜索窗口的传输需要占用30MByte/s以上的总线带宽,这也是便携式处理器无法接受的。
当前大多数快速搜索算法旨在提高整像素和分像素搜索的速度,减少每次搜索所需的SAD和插值运算次数。本发明提出的一种算法旨在减少整像素和分像素搜索的次数,本算法对符合要求的目标块,不需要做整像素和分像素搜索,只需要做一次预测点的插值和SAD计算即可找到较优的分像素匹配块,对其余的块,我们依然采用普通的菱形快速搜索和分像素搜索的方法。另外,对搜索起始点进行预测能使得大部分搜索在开始的时候就接近最优点,也因此提高了搜索效率,本发明中也采纳了这一方法。
本发明的一个目的在于提供一种视频编码系统中的运动估计装置,所述装置包括:
预测运动向量发生模块,用于产生目标块的预测运动向量;
预测目标块估计模块,使用预测运动向量对参考块进行插值得到预测目标块,并计算所述预测目标块与目标块之间的绝对误差和(SAD);
预测运动向量裁决模块,比较所述绝对误差和(SAD)与设定的阈值,基于比较结果决定是否进行整像素与分像素运动估计;
整像素与分像素运动估计模块,用于进行整像素与分像素运动估计,在搜索窗口中寻找最佳整像素匹配块。
进一步,还包括基于当前帧的设定阈值对下一帧的阈值进行调整的装置。
进一步,基于当前帧的设定阈值对下一帧的阈值进行调整的装置使用以下公式调整下一帧的阈值:
其中,SAD_thresholdn+1表示第n+1帧图像的绝对误差和阈值,SAD_thresholdn表示第n帧图像的绝对误差和阈值,ASRn表示第n帧图像的实际搜索比,OSRn表示第n帧图像的最优搜索比。
进一步,所述设定的阈值是通过对预定测试流的绝对误差和阈值与实际搜索比进行函数拟合而确定的。
进一步,所述设定的阈值是通过计算所述拟合的函数的拐点而确定的。
进一步,所述比较结果为:当所述绝对误差和(SAD)小于设定的阈值时,直接用预测运动向量作为所述目标块的运动向量;当所述绝对误差和(SAD)大于设定的阈值时,进行整像素与分像素运动估计。
本发明的第二个目的在于提供一种视频编码系统中的运动估计方法,所述方法包括:
产生预测运动向量;
使用所述预测运动向量对参考块进行插值得到预测目标块,计算所述预测目标块与目标块之间的绝对误差和(SAD);
比较所述绝对误差和(SAD)与设定的阈值,基于比较结果决定是否进行整像素与分像素运动估计;
整像素与分像素运动估计,首先用菱形算法搜索最佳整像素块,然后使用分像素搜索得到最佳分像素块。
进一步,还包括基于当前帧的设定阈值对下一帧的阈值进行调整。
进一步,所述基于当前帧的设定阈值对下一帧的阈值进行调整使用以下公式调整下一帧的阈值:
其中,SAD_thresholdn+1表示第n+1帧图像的绝对误差和阈值,SAD_thresholdn表示第n帧图像的绝对误差和阈值,ASRn表示第n帧图像的实际搜索比,OSRn表示第n帧图像的最优搜索比。
进一步,所述设定的阈值是通过对预定测试流的绝对误差和阈值与实际搜索比进行函数拟合而确定的。
进一步,所述设定的阈值是通过计算所拟合的函数的拐点而确定的。
进一步,所述比较结果为:当所述绝对误差和(SAD)小于设定的阈值时,直接用预测运动向量作为所述目标块的运动向量;当所述绝对误差和(SAD)大于设定的阈值时,进行整像素与分像素运动估计。
经过实际的测试,对大部分的视频序列,本发明对50%以上的搜索是有效的,对某些运动较少的低比特率序列,甚至可以达到90%以上的有效性。相对于单纯的菱形搜索,本发明以牺牲PSNR 0.1以内的微小代价,换得了至少2倍的速度提升。此外,本发明还能节省传输搜索窗口所需的总线带宽。
附图说明
图1为按照本发明的运动估计模块框架图;
图2是预测运动向量发生器生成预测运动向量过程的示意图;
图3为在Matlab中采用三次样条插值函数对Akiyo_cif测试流的拟合结果;
图4为计算阈值最优时的ESR与OSR的函数关系式时使用的线性拟合图;
图5为动态调整阈值步骤的流程图。
具体实施方式
图1是本发明的运动估计模块框架图,包括:预测运动向量发生模块101,预测运动向量裁决模块102,预测目标块估计模块103,整像素与分像素运动估计模块104。本发明提出的运动估计方法的各步骤在以上的4个模块中执行。
本发明中,将目标块的运动估计分为4个步骤。首先,执行预测运动向量产生步骤,通过预测运动向量发生器产生预测运动向量;然后,执行预测目标块估计步骤,使用所述预测运动向量对参考块进行插值得到预测目标块,计算所述预测目标块与目标块之间的绝对误差和(SAD);之后,执行预测运动向量裁决步骤,通过比较所述绝对误差和(SAD)与设定的阈值的大小,决定是否进行整像素与分像素运动估计步骤;最后,如果所述绝对误差和(SAD)小于设定的阈值,则完成目标块的运动估计;否则,执行整像素与分像素运动估计步骤,即首先用菱形算法搜索最佳整像素块,然后使用分像素搜索得到最佳分像素块。所谓整像素搜索,就是指在搜索窗口中寻找最佳整像素匹配块的过程。分像素搜索是指对整像素匹配块进行适当的插值运算,以期找到更高匹配程度的匹配块的过程。这些过程都是为大家都共识的,因为公知的功能与结构会以不必要的细节掩盖本发明,所以对其不进行详细描述。
图2是预测运动向量发生模块产生预测运动向量过程的示意图。
当前块的位置是C块203,其左,上,右上块分别是L块204,U块201和UR块202。它们的运动向量分别是MVL,MVU,MVUR,每个向量包含水平和垂直方向的两个分量。首先从MVL,MVU,MVUR的三者的水平分量中取中间值得到预测运动向量的水平分量,再从它们的垂直分量中取中间值得到预测运动向量的垂直分量,这就是所谓的“取中值法”。需要注意的一点是,如果L204,U201,UR202位置的块不存在,则在生成预测运动向量的过程中,将它们的运动向量设为(0,0)。
预测目标块估计至多需要一次插值和一次SAD运算。这个过程是,首先以预测运动向量的整数部分作为偏移从参考帧中取出一个参考块,然后根据分像素部分查表得到相应的插值系数,对这个参考块进行插值得到一个预测目标块,最后再将这个预测目标块与目标块一起做一次SAD运算。相对后续搜索所需要的至少4次插值和15-20次SAD运算来说,是很小的一个运算量。如果能够让搜索中止于此,将对搜索速度有一个很大的提升。事实上我们也发现,通过后续搜索所得到的匹配块与预测目标块是一致的,有时虽然不一致,但相似度甚至不如预测目标块。如何能够在作完预测目标块估计之后,就事先知道后续搜索是无效的呢?我们可以通过对预测目标块SAD设立阈值来解决问题。
如前所述,我们从目标块的‘左’,‘上’,‘上右’三个位置的运动向量中采用“取中值法”挑选出一个,作为目标块的预测运动向量。然后使用该运动向量计算参考块得到相应的SAD。如果该SAD比设定的阈值小,则直接用预测运动向量作为本块的运动向量,否则继续进行后续搜索。为保证准确性,阈值还需要动态的调整,我们可以通过使用线性拟合算法来寻找“最优搜索比”与“有效搜索比”之间的函数关系式,从而找到动态调整最优阈值的方法。后面将参照图5作进一步描述。
此外,本发明提出的方法还可以节省大量内存带宽。例如,对于4抽头滤波器,16×16的预测目标块估计至多需要19×19个像素点,不需要把52×52大小的搜索窗口全部复制到高速缓存。我们可以在搜索的第一步时只复制19×19个像素点至高速缓存,只有当预测目标块的SAD大于阈值时,由于需要进行执行整像素与分像素运动估计步骤,才需要将剩余的像素点复制过去。如果预测目标块估计的效率比较高的话,可以节省大量的内存带宽。事实上,经过实际的测试,对大部分的视频序列,本算法对50%以上块是有效的,对某些运动较少的低比特率序列,甚至可以达到90%以上的有效性。
在本方法中,只有当预测块的SAD值大于阈值时,才需要进行后续的整像素和分像素搜索,我们把实际进行的搜索次数称为实际搜索次数,将实际搜索次数与块的个数相除得到实际搜索比(Actual Search Ration)。
(公式1)
对于一次整像素和分像素搜索,如果最终搜索到的匹配块的SAD比预测目标块的SAD小,则称为有效搜索,否则称为无效搜索。将有效搜索次数与总共的搜索次数相除,得到有效搜索比(Effective Search Ration)。
(公式2)
以下是动态阈值的采样和调整过程的推导。
通过对MPEG4提供的7个标准测试流的测试,我们可以得到下表:
测试流 |
有效搜索比(ESR) |
Hall_cif |
7.41% |
Akiyo_cif |
7.81 |
Container_cif |
11.25% |
News_cif |
13.61% |
Mother_daughter_cif |
14.67% |
Coastguard_cif |
29.8% |
Foreman_cif |
30.71% |
表1:各测试流的ESR
在上表中可以看出,大部分的搜索都是无效的,也就是说预测点的SAD在大部分情况下都比通过整像素和分像素搜索所得到的最优匹配块的SAD小或者相等。因此,本发明中,在对一个目标块进行搜索前先设定一个阈值,当预测目标块估计得到的SAD小于该阈值时即停止后面的搜索,反之继续。而对预测目标块SAD阈值的设定则成为了本算法的关键。事实上,若阈值定得过大,则会影响搜索效果,反之若定得过小,则基本上不会起什么作用。而且,该阈值对于各个不同的测试流也不是一成不变的,不同的测试流有着不同的最优阈值。
如果把阈值设为0,则所有的块都要进行搜索,此时一幅图象的搜索次数等于块的个数。在逐步增加阈值的情况下,搜索次数也会相应的减少,当然此时也会伴随着搜索效果的降低,即图像峰值信噪比(PSNR:PeakSignal-to-Noise Ratio)的降低。我们要做的事情是在搜索次数与性能损失之间找到一个平衡,争取在最小性能损失的前提下使用最少的搜索次数得到最优匹配块。
在对7个标准测试流的测试后,我们得到了SAD_threshold(绝对误差和阈值),PSNR,ESR,ASR,bitrate(比特率,也就是每秒钟的比特数)五者之间关系的数据。
表2Hall_cif流测试数据(其中Bits/frame为每帧的比特数)
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
0 |
34.737 |
7.41 |
100 |
7924 |
500 |
34.736 |
7.41 |
83.5 |
7924 |
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
600 |
34.736 |
7.39 |
67.2 |
7923 |
700 |
34.735 |
7.26 |
53.4 |
7920 |
800 |
34.727 |
6.94 |
44.3 |
7914 |
900 |
34.721 |
6.61 |
36.3 |
7913 |
1000 |
34.712 |
6.21 |
30.36 |
7917 |
1100 |
34.703 |
5.81 |
25.5 |
7916 |
1200 |
34.696 |
5.38 |
20.63 |
7920 |
1300 |
34.68 |
4.84 |
16.44 |
7917 |
1400 |
34.672 |
4.44 |
13.17 |
7928 |
1500 |
34.667 |
4.13 |
10.46 |
7937 |
1600 |
34.664 |
3.85 |
8.48 |
7964 |
1700 |
34.66 |
3.59 |
7.01 |
7977 |
1800 |
34.654 |
3.35 |
5.814 |
8000 |
1900 |
34.65 |
3.12 |
5.075 |
7999 |
2000 |
34.65 |
2.87 |
4.52 |
7988 |
2100 |
34.65 |
2.72 |
4.13 |
7998 |
2200 |
34.649 |
2.5 |
3.79 |
8015 |
表3Container_cif流测试数据(其中Bits/frame为每帧的比特数)
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
0 |
33.275 |
11.25 |
100 |
7729 |
500 |
33.272 |
11.24 |
88.94 |
7733 |
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
600 |
33.270 |
11.18 |
82.06 |
7750 |
700 |
33.268 |
11.26 |
72.68 |
7777 |
800 |
33.264 |
11.15 |
64.46 |
7808 |
900 |
33.259 |
11.02 |
57.25 |
7837 |
1000 |
33.247 |
10.74 |
49.84 |
7881 |
1100 |
33.231 |
10.26 |
42.70 |
7966 |
1200 |
33.217 |
9.61 |
36.25 |
8081 |
1300 |
33.2 |
8.79 |
31.37 |
8224 |
1400 |
33.183 |
8.09 |
27.09 |
8336 |
1500 |
33.166 |
7.27 |
21.93 |
8463 |
1600 |
33.142 |
6.52 |
17.53 |
8577 |
1700 |
33.114 |
5.86 |
13.21 |
8683 |
1800 |
33.088 |
5.08 |
10.7 |
8788 |
1900 |
33.061 |
4.38 |
9.12 |
8936 |
2000 |
33.027 |
3.67 |
7.94 |
9164 |
表4Coastguard_cif流测试数据(其中Bits/frame为每帧的比特数)
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
0 |
31.377 |
29.8 |
100 |
21882 |
800 |
31.3768 |
29.8 |
98 |
21882 |
900 |
31.3764 |
29.74 |
96.37 |
21875 |
1000 |
31.373 |
29.63 |
92.58 |
21888 |
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
1100 |
31.369 |
29.48 |
86.21 |
21903 |
1200 |
31.361 |
29.12 |
78.8 |
21947 |
1300 |
31.355 |
28.38 |
71.38 |
21998 |
1400 |
31.341 |
27.6 |
64.4 |
22076 |
1500 |
31.327 |
26.67 |
57.89 |
22162 |
1600 |
31.309 |
25.62 |
51.89 |
22301 |
1700 |
31.291 |
24.178 |
46.3 |
22415 |
1800 |
31.265 |
23.08 |
41.3 |
22621 |
1900 |
31.241 |
21.75 |
36.68 |
22855 |
2000 |
31.213 |
20.52 |
32.67 |
23084 |
2100 |
31.193 |
19.17 |
28.74 |
23328 |
2200 |
31.162 |
17.99 |
25.44 |
23671 |
2500 |
31.079 |
14.8 |
18.5 |
24751 |
表5Akiyo_cif流测试数据(其中Bits/frame为每帧的比特数)
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
0 |
36.722 |
7.81 |
100 |
3963 |
200 |
36.722 |
7.81 |
98.48 |
3963 |
500 |
36.718 |
7.753 |
47.3 |
3961 |
550 |
36.717 |
7.68 |
42.44 |
3957 |
600 |
36.706 |
7.486 |
37.51 |
3950 |
650 |
36.705 |
7.45 |
34.48 |
3948 |
0 |
36.722 |
7.81 |
100 |
3963 |
700 |
36.703 |
7.41 |
32.573 |
3950 |
750 |
36.700 |
7.37 |
30.596 |
3953 |
800 |
36.693 |
7.24 |
28.71 |
3953 |
850 |
36.682 |
7.05 |
26.28 |
3959 |
900 |
36.669 |
6.91 |
24.2 |
3971 |
950 |
36.654 |
6.65 |
22.28 |
3977 |
1000 |
36.638 |
6.36 |
19.79 |
3995 |
1050 |
36.625 |
6.13 |
17.62 |
4001 |
1100 |
36.609 |
5.78 |
15.51 |
4015 |
1150 |
36.597 |
5.42 |
13.86 |
4022 |
1200 |
36.581 |
5.10 |
12.085 |
4052 |
1250 |
36.558 |
4.73 |
10.33 |
4071 |
1300 |
36.535 |
4.383 |
8.89 |
4114 |
1350 |
36.514 |
4.057 |
7.64 |
4148 |
1400 |
36.493 |
3.72 |
6.578 |
4192 |
表6Mother_daughter_cif流测试数据(其中Bits/frame为每帧的比特数)
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
0 |
36.15 |
15.95 |
100 |
4183 |
200 |
36.15 |
15.98 |
93.63 |
4183 |
300 |
36.15 |
15.98 |
79.58 |
4183 |
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
400 |
36.15 |
15.97 |
74 |
4183 |
500 |
36.15 |
16 |
65.9 |
4188 |
600 |
36.147 |
15.9 |
60.2 |
4198 |
700 |
36.139 |
15.66 |
52.98 |
4204 |
800 |
36.128 |
15.32 |
45.9 |
4220 |
900 |
36.098 |
14.67 |
38.38 |
4240 |
1000 |
36.063 |
13.65 |
30.05 |
4276 |
1050 |
36.035 |
12.93 |
25.76 |
4300 |
1100 |
36.003 |
12.32 |
22.05 |
4344 |
1150 |
35.962 |
11.48 |
18.79 |
4395 |
1200 |
35.913 |
10.71 |
16.17 |
4453 |
1250 |
35.877 |
9.92 |
13.88 |
4519 |
1300 |
35.827 |
9.12 |
12.07 |
4617 |
表7Foreman_cif流测试数据(其中Bits/frame为每帧的比特数)
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
0 |
33.065 |
30.71 |
100 |
14358 |
500 |
33.062 |
30.06 |
93.78 |
14372 |
600 |
33.065 |
29.82 |
90.1 |
14624 |
700 |
33.057 |
30.48 |
84.1 |
14390 |
800 |
33.054 |
30.12 |
77.11 |
14380 |
900 |
33.051 |
29.64 |
69.96 |
14436 |
1000 |
33.039 |
28.97 |
62.94 |
14452 |
1100 |
33.019 |
27.81 |
56.76 |
14535 |
1200 |
32.995 |
26.76 |
51.13 |
14631 |
1300 |
32.980 |
25.23 |
45.7 |
14776 |
1400 |
32.947 |
24.06 |
41.08 |
14940 |
1500 |
32.915 |
22.68 |
36.84 |
15122 |
1600 |
32.882 |
21.26 |
32.93 |
15380 |
1700 |
32.854 |
20 |
29.7 |
15617 |
1800 |
32.826 |
18395 |
26.91 |
15898 |
表3News_cif流测试数据(其中Bits/frame为每帧的比特数)
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
0 |
34.664 |
13.61 |
100 |
8375 |
300 |
34.664 |
13.61 |
90.39 |
8375 |
400 |
34.664 |
13.61 |
82.2 |
8375 |
500 |
34.662 |
13.61 |
68.54 |
8380 |
600 |
34.663 |
13.54 |
60.92 |
8373 |
700 |
34.659 |
13.45 |
54.64 |
8381 |
800 |
34.647 |
13.14 |
47.03 |
8397 |
900 |
34.630 |
12.68 |
40.5 |
8409 |
1000 |
34.609 |
12.07 |
34.87 |
8466 |
1100 |
34.590 |
11.38 |
30.14 |
8504 |
1200 |
34.564 |
10.53 |
25.71 |
8561 |
阈值 |
PSNR |
ESR(%) |
ASR(%) |
Bits/frame |
1300 |
34.537 |
9.66 |
21.36 |
8654 |
1400 |
34.501 |
8.93 |
17.72 |
8757 |
1500 |
34.473 |
8.08 |
14012 |
8858 |
为了找到各个测试流的最优阈值,需要对每个流的SAD_threshold和ASR进行函数拟合,从而找到最优的ASR值,图3是在Matlab中采用三次样条插值函数对Akiyo_cif测试流的拟合结果。
通过计算函数的拐点可以得到该测试流的最优阈值和此时的ASR分别是850和26.28%,也就是说,当把阈值设为850时,只有26.28%的块需要搜索。查表可以得到此时的PSNR损失为0.04,几乎可以忽略。
我们将最优阈值对应的实际搜索比称为最优搜索比率(OptimalSearch Ration)。采用同样的方法可以计算出其它测试流的最优阈值和最优搜索比,总结如下:
测试流 |
ESR(有效搜索比) |
OSR(最优搜索比) |
SAD_threshold |
Hall_cif |
4.84% |
16.44% |
1300 |
Akiyo_cif |
7.05% |
26.28% |
850 |
Container_cif |
8.09% |
27.09% |
1400 |
News_cif |
12.07% |
34.87% |
900 |
Mother_daughter_cif |
14.67% |
38.38% |
900 |
Coastguard_cif |
23.08% |
41.3% |
1800 |
Foreman_cif |
25.23% |
45.7% |
1300 |
图4为考虑到计算的复杂度,采用线性拟合,得到阈值最优时的ESR与0SR的函数关系式:
OSR=2*ESR+10when ESR<15 (公式3)
OSR=1*ESR+20when ESR>=15
图5为动态调整阈值步骤的流程图;以下参照图5描述动态调整阈值的计算步骤,其中,P帧是指单向预测帧,通常以前一个P帧作为参考帧,来消除时间上的冗余,同时也将作为下一个P帧的参考帧。
步骤1:编码一个视频段(GOP)501,并在此前预设:
blocks=0,blocks_Search=0,blocks_EffectiveSearch=0,SAD_threshold=SAD0
步骤2:判断是否为最后帧504,若为是,则结束;
否则,对于每一个块:blocks++506;
预测目标块估计:使用“取中值法”从目标块的‘左’,‘上’,‘上右’三个位置的运动向量中挑选出预测运动向量,将19×19的参考块复制到高速缓存,使用预测运动向量对参考块插值得到预测目标块,并计算预测目标块与目标块之间的绝对误差和(SAD)507;
如果预测SAD小于阈值508,则预测运动向量是最优运动向量,从而得到最优运动向量,然后继续判断是否为最后块505,直至该P帧的所有目标块都搜索完毕;
否则,拷贝剩余的2343字节的搜索窗口至高速缓存,对该目标块实行整像素搜索和分像素搜索,得到最优运动向量和相应的最优SAD 509;
blocks_Search++510;
如果最优SAD大于或等于预测SAD 511,则预测运动向量是最优运动向量,从而得到最优运动向量,然后继续判断是否为最后块505,直至该P帧的所有目标块都搜索完毕;
否则,blocks_EffectiveSearch++512,实际估计得到的运动向量是最优运动向量,从而得到最优运动向量;
步骤3:继续步骤2,判断是否为最后块505,直至该P帧的所有目标块都搜索完毕。
步骤4:分别利用公式(1),(2),(3)初始化数据,即计算该P帧的ESR,ASR和OSR 502;
步骤5:使用以下公式修改下一P帧的阈值:
其中,SAD_thresholdn+1表示第n+1帧图像的绝对误差和阈值,SAD_thresholdn表示第n帧图像的绝对误差和阈值,ASRn表示第n帧图像的实际搜索比,OSRn表示第n帧图像的最优搜索比。
步骤6:为了防止误差累积,到下一个视频段(GOP)时,重新设定SAD_threshold=SAD0,但blocks,blocks_Search,blocks_EffectiveSearch依然有效。
以上所述,仅为本发明中的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉该技术的人在本发明所揭露的技术范围内,可轻易想到的变换或替换,都应涵盖在本发明的包含范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。