关于JCT-VC的A033文档的理解(运动表示)

由于分块有矩形分法和几何分法,所以运动表示也有两种分法。

首先对于矩形分法来说,与H.264不同的是现在加入了时域上的距离因素。也就是说,由于预测参考系不同,参考mv要拿到当前块来用的话就必须进行线性的scale(所谓的normalize的一个过程)。然后ABC三块的mv取中值用来作为当前块的mv。再者,为了能够降低传mv的比特率,我们定义了一个预测和编码交织的概念。

首先,竖直方向的运动矢量用传统的中值方式得出,然后传mvd

其次,遍历ABC块,取出一个与mvp最接近的竖直方向mv的块(SAD最小),这个块的mv水平分量就直接用来当做mvp的水平分量(这样就省掉了传水平方向mvp的值)。

当然具体实现过程如下:首先定义最左上点叫做(x0,y0),块的宽为currW,高为currH,用mvDiff代替了MVD,其中mvDiff[0]是指水平成分的,mvDiff[1]是指竖直成分的差值。

接下去就是算法,先得出vertical在得出horizon。

竖直方向(主要任务是生成mvPred[1]):

      1.生成ListMvCompY这样一个列表(Y代表Y-axis,即竖直,Comp is short for component),用于存放(参考)竖直矢量成分,          主要使用abc块的矢量。定义numCompY作为entries,listMvCompY[k],0<k<numCompY-1作为里面的项。

         a.选出abc块来作为预测块,这些要求包含点(x0-1,y0)(左上角偏左点),(x0,y0-1),(x0+currW,y0-1)

 b.如果c块与当前块不在一个片区(slice)或者编码时顺序落后于当前块则用包含(x0-1,y0-1)(也就是D处)

 c.将abc的mv做scale操作放入listMvCompY中

 

         当numCompY=0的时候,说明没有可以参考的mv,故mvPred[1]=0

 当numCompY=1时,则用mvPred[1]=listMvCompY[0]

 当numCompY=2时,则取中值即可(最常规的方式)

 当numCompY>2时,将listMvCompY数组顺序排列,取中间值即可(不是中值,是指位置处在中间)(疑问:不是最多也就a三               个吗,为什么这里要假设那么多?)

 

水平方向(主要任务是生成mvPred[0]):

        1.定义currMv[1]=mvPred[1]+mvDiff[1];sert of blks 作为与当前块处在一个slices中的邻块预测块的集合,包含左邻边的像素和上邻边的像素,所以这里可能就不止3块了,因为要将贴在左上两边的块都算进去。

           定义listMv作为各个邻块的运动矢量列表(也是按照scale比例变换之后存入到这个数组中去的,由于要做垂直比较和水平利用,所以是二维数组,listMv[i][1]是竖直方向,listMv[i][0]为水平方向,是nx2的数组)

           令numMv作为listMv的entries,如果numMv=0,则mvPred[0]=0,否则如下:(事实上是一个冒泡排序的一个做法,取出竖直方向mv最接近当前竖直mv的块,把这个块的水平mv用来作为mvpred[0])

          a.令变量compY=listMv[0][1],minDelta=abs(listMv[0][1]-currMv[1])

          b.i范围是1-numMv-1,当abs(listMv[i][1]-currMv[1])小于或等于minDelta且listMv[i][1]小于compY(含义是差值要小,而且要小在短mv上,因为差值高出和小于都是可以的,一般取小于的话传输的内容和比特也可以笑)时,作compY=listMv[i][1]

          c.接下去就是用来生成listMvCompY数组

            在listMv中遍历,把等于CompY的值取出来,得到listMv[i][1]( b的遍历相当于用来取出最小的数,这里遍历找出这个数位置在哪里。因为可能好几个位置的竖直mv都是满足条件的,所以b中如果采用记下标的形式的话无法实现,所以用两个遍历)。然后把listMv[i][0]插入到listMvCompY中

          d.这里步骤同竖直方向的c步骤。

 

 

(疑问:这些步骤看不出哪里可以节省比特流,同时也察觉不到mvp的精确性)


  

对于几何分型来说,过程较为简单。本身划分块就很复杂,我觉得可以只增加对三角,模拟纹理。

The prediction motion vector mvPred is derived as specified by the folowing ordered steps: 
       1.   If blkA, blkB and blkC are all connected to the current partition, median filter is used to derive  mvPred.

             Otherwise, if blkA is connected to the current partition, mvPred = mvA

  1. Otherwise, if blkB is connected to the current partition, mvPred = mvB
  2. Otherwise, if blkE is connected to the current partition, mvPred = mvE
  3. Otherwise, if blkF is connected to the current partition, mvPred = mvF
  4. Otherwise, if blkC is connected to the current partition, mvPred = mvC
  5. Otherwise mvPred = (0,0)

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值