运动估计

一、概述

运动估计的基本思想是将图像序列的每一帧分成许多互不重叠的宏块,并认为宏块内所有象素的位移量都相同,然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。视频压缩的时候,只需保存运动矢量和残差数据就可以完全恢复出当前块。

这段来源于百度:http://baike.baidu.com/view/3047417.htm

第一句,说把一帧分成许多不重叠的宏块,涉及到几个概念,一个是分隔,一个是不重叠,一个是宏块,H.264的宏块,都是16*16的像素块,其中又有一个隐含的概念,就是一个宏块包含亮度,色度U和色度V,其中.....二比一的关系。

第二句,认为宏块内所有像素的位移量都相同。

当然,实际情况可能是一个宏块内的像素属于两个运动物体,比如属于两只小鸟,分别飞往两个方向,这样的话,这分属于两个小鸟的像素的位移,包括移动距离和方向,都是不一样的,但这样太复杂了,而且,H.264里,用到这个位移,它并不是要真的研究位移,只是为了压缩样本像素的网络传输,所以,在高度复杂的问题面前,没必要纠结对与错。而是把宏块作为一个整体来看的。它只是要在参考帧中找到一个类似的块来求差,而参考帧的这个块,也许和当前的块根本就没任何关系。

我是这样猜出想的,比如这个帧里,有一块纯黑的区域,在同一个帧里,还有另一块纯黑的区域,如下图:

运动估计 - 加菲 -  .
假定这个图从左向右移动,它就成了一段连续的,相似的动画,或者叫一个序列算了。这样的话,在上面的那个黑色区域里的某一个宏块,可以用前一帧对应位置附近的一个黑色宏块作参考,也可以用前一帧里,下面这个黑色区域里的一个宏块作参考,在小范围里来说,压缩效果是一样的。
看H.264里,有个最优匹配的概念,对于这个纯色的图来说,没什么太大的感觉,如果对于那些花花绿绿的真彩色图来说,很少存在这样的纯色块,那个最优匹配应该就有优势了。
在真彩色的每一个宏块,它并不见的能找到一个和它一样样的宏块来作参考,一般也就找个比较接近的,那这个最优匹配,就是找最近似的了吧,如何认为是最近似的,好像是H.264里的SAE什么的,不管是不是它,肯定有一个判断的标准。
宏块作为一个整体,最匹配的块的判断,当然也得着眼于整个宏块,比如两个宏块对应位置求差,然后把这个差加起来,估计应该是差的绝对值加起来,哪个小说明更接近,印象中还有什么均方什么的,这样判断实际还是为了码流来服务的,如果是肉眼来判断是否是通过它位移得到另一个宏块,我们就不能用数学的一个值来判断了,比如一个人移动的过程中,鼻子上的宏块,只能由鼻子上的宏块移动得到,不能因为屁股上的一个宏块和它数学上更近似,就说鼻子上的宏块是屁股上的那个宏块的最优匹配,是吧,哈哈,这个例子太好了。
 
第三句:
然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相似的块,即匹配块
当前帧里的每个宏块到参考帧里找,这里还有一个隐含的概念,每一个宏块都要找一个区配块。
要到参考帧里去找
参考帧,在编码器端,表现为已编码过的前面帧的重构图像。
是否匹配,标准是一定的匹配准则,它并不管是不是属于同一个运动物体,它只是让它们在类似求差过程中更接近就行了。
 
其实,用我的个人的看法,可以这样来理解,在发第二帧的时候,最原始的方法是发送每一个像素的原始值,但是,现在为了压缩,可以告诉解码器,第二帧和第一帧的区别,只是最右下角多了个黑点,这样只要传送这个黑点就行了。发第三帧的时候,就说,左上角也多了个黑点,基本就这意思。
 
一定要注意,对每个宏块都要找区配块。也许有例外吧,反正我现在这样记下了。
 
第四句,匹配块与当前块的相对位移即为运动矢量
这个相对位移,是有方向的,放到C++语言里,一个帧图像,表示是用二维数组来表示的,一个宏块,也是用二维表示的,也可能有一维吧,按二维来理解就行了,一维只是表现形式,本质还是二维的。
 
对于阵列,表示移,可以都参考最左上角的那个,把它作为原点,来表示这个位移,那就有水平移动和纵向移动。这个值估计不会是很大,它的值可能会是多少呢,比如100*100的分辨率,呵呵,假定就有这个分辨率,那么100/16=6.25,书上不是有补够16的倍数的说法么,那被成7个宏块,纵向和水平都如此,那么,这个位移最大可能是水平移动7个,纵向移动七个,就是左上角的移到右下角,总不会比这个更远了吧。就是0-6的取值范围。
这样表示这个位移,就需要3个比特,即三个二进制位。
书上还有个说法,利用前面的位移来预测当前块的mv,估计能把需要三个比特的用两个比特来解决,不要看只是一比特,因为每个宏块都要传输,累计起来也是很怕的,就象原来的千年虫一样,如果我们赚钱也这样就好了,呵呵。
 
最后一句:视频压缩的时候,只需保存运动矢量和残差数据就可以完全恢复出当前块。
如果单独的把这句拿出来,肯定是不可能实现的。它得依赖于上下文,呵呵,记住上下文这词了,也算是一个小小的进步。
完整的描述应该是,保存下运动矢量和残差,通过参考帧找到参考宏块,就可以恢复出当前块来。
 
二、基本概念
  在帧间预测编码中,由于活动图像邻近帧中的景物存在着一定的相关性。因此,可将活动图像分成若干块或宏块,并设法搜索出每个块或宏块在邻近帧图像中的位置,并得出两者之间的空间位置的相对偏移量,得到的相对偏移量就是通常所指的运动矢量,得到运动矢量的过程被称为运动估计。
  运动矢量和经过运动匹配后得到的预测误差共同发送到解码端,在解码端按照运动矢量指明的位置,从已经解码的邻近参考帧图像中找到相应的块或宏块,和预测误差相加后就得到了块或宏块在当前帧中的位置。
  通过运动估计可以去除帧间冗余度,使得视频传输的比特数大为减少,因此,运动估计是视频压缩处理系统中的一个重要组成部分。本节先从运动估计的一般方法入手,重点讨论了运动估计的三个关键问题:将运动场参数化、最优化匹配函数定义以及如何寻找到最优化匹配。
 
运动矢量,就是告诉解码的时候,当前块参考的哪个宏块。用这个参考宏块和预测误差相加,就得到了当前块的正确值了。
 
 
三 运动估计的方法
  一般的运动估计方法如下: 设 t 时刻的帧图像为当前帧 f (x, y) , t’时刻的帧图像为参考帧 f’(x,y),参考帧在时间上可以超前或者滞后于当前帧,如图1所示,当 t’<t 时,称之为后向运动估计,当 t’>t 时,称之为前向运动估计。当在参考帧 t’中搜索到当前帧 t 中的块的最佳匹配时,可以得到相应的运动场 d(x; t, t + t △ ) ,即可得到当前帧的运动矢量。
 

运动估计 - 加菲 -  .

 
 
H.264 编码标准和以往采用的视频压缩标准很大的不同在于,在运动估计过程中采用了多参考帧预测来提高预测精度,多参考帧预测就是在编解码端建一个存储 M个重建帧的缓存,当前的待编码块可以在缓存内的所有重建帧中寻找最优的匹配块进行运动补偿,以便更好地去除时间域的冗余度。由于视频序列的连续性,当前块在不同的参考帧中的运动矢量也是有一定的相关性的。假定当前块所在帧的时间为 t, 则对应前面的多个参考帧的时间分别为:t-1, t-2, ……。则当在帧 t-2 中搜索当前块的最优匹配块时,可以利用当前块在帧 t-1 中的运动矢量 MVNR来估测出当前块在帧 t-2 的运动矢量。
 
 
对这段没什么感觉,只是有个疑问:当前帧的运动矢量?
 
四 运动表示法
  由于在成象的场景中一般有多个物体作不同的运动,如果直接按照不同类型的运动将图像分割成复杂的区域是比较困难的。最直接和不受约束的方法是在每个像素都指定运动矢量,这就是所谓基于像素表示法。这种表示法是对任何类型图像都是适用的,但是它需要估计大量的未知量,并且它的解时常在物理上是不正确,除非在估计过程中施加适当的物理约束。这在具体实现时是不可能的,通常采用基于块的物体运动表示法。
      对于其中的一句,“它的解时常在物理上是不正确的”,这个没什么体会,基本算是只认识这几个字吧,至于如何不正确,只有天知道。
 

4.1 基于块的运动表示法

  一般对于包含多个运动物体的景物,实际中普遍采用的方法是把一个图像帧分成多个块,使得在每个区域中的运动可以很好地用一个参数化模型表征,这被称为块匹配法,即将图像分成若干个n×n 块(典型值:16×16 宏块) ,为每一个块寻找一个运动矢量 MV,并进行运动补偿预测编码。 每一个帧间宏块或块都是根据先前已编码的数据预测出的,根据已编码的宏块、块预测的值和当前宏块、块作差值,结果被压缩传送给解码器,与解码器所需要的其他信息如(运动矢量、预测模型等)一起用来重复预测过程。 每个分割区域都有其对应的运动矢量,并必须对运动矢量以及块的选择方式进行编码和传输。在细节比较多的帧中如果选择较大的块尺寸,意味着用于表明运动矢量和分割区域类型的比特数会少些,但是运动压缩的冗余度要多一些;如果选择小一点的块尺寸,那么运动压缩后冗余度要少一些,但是所需比特数要比较多。因此必须要权衡块尺寸选择上对压缩效果的影响,一般对于细节比较少、比较平坦的区域选择块尺寸大一些,对于图像中细节比较多的区域选择块尺寸小一些。 宏块中的每个色度块 (Cb 和 Cr) 尺寸宽高都是亮度块的一半, 色度块的分割方法和亮度块同样,只是尺寸上宽高都是亮度块一半(如亮度块是 8×16 块尺寸大小,那么色度块就是 4×8,如果亮度块尺寸为 8×4,那么色度块便是 4×2 等等) 。每个色度块的运动矢量的水平和垂直坐标都是亮度块的一半。
 
其实,在很多时候,会有大半个图像都是某一种纯色,比如在主席台后挂一块大红布,这样还按16*16,也存在浪费,不过,按现在的方法,最大好像只能是16*16,相信以后会有改变的。
根据已编码的宏块、块预测的值和当前宏块、块作差值,结果被压缩传送给解码器。这句,在x264里,好像不是直接把差值,也叫做残差发送出去,残差又经过DCT变换,再经过量化,才发出去的。
记的说是,DCT是没有误差的,但是在量化的过程中,会引入量化误差。
DCT叫离散余弦变换
还有那句:“一般对于细节比较少、比较平坦的区域选择块尺寸大一些,对于图像中细节比较多的区域选择块尺寸小一些”,这个在毕厚杰的书上有一个图的,在人体的边界处,会分的较细较小的块。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值