HEVC 帧间预测

1.PU划分

--Merge,skip模式,PU的大小是2N*2N

--帧间预测PU分割模式共有8种,主要分为两类:对称分割和非对称分割。

其中,2N*2N,2N*N,N*2N和N*N为4种对称模式。

2N*nU,2N*nD,nL*2N和nR*2N为4种非对称模式,U、D、L和R分别表示上下左右,且非对称划分形式只用于大小为32*32和16*16的CU中,对称划分形式的N*N只用于大小为8*8的CU中。例如,2N*nU和2N*nD分别以上下1:3和3:1划分,nL*2N和nR*2N分别以左右1:3和3:1划分。

2.帧间预测是利用视频时间域的相关性,使用邻近已编码图像像素预测当前图像的像素,以达到有效去除视频时域冗余的目的。目前主要采用基于块的运动补偿技术,原理是为当前图像的每个像素块在之前已编码图像中寻找一个最佳匹配块,即运动估计。用于预测的图像称为参考图像,参考块到当前像素块的位移称为运动矢量(MV),当前块与参考块的差值称为预测残差。 
帧间预测分块方式如下: 
这里写图片描述 
帧间预测可以分为两个过程:运动估计和运动补偿。 
运动估计(motion estimation,ME)——提取当前图像运动信息的过程。为当前编码块在已编码块中寻找最佳估计快,使得预测块与当前块残差尽可能的小,并计算当前块的偏移MV(motion vector)。 
运动补偿(motion compensate,MC)——根据运动矢量和帧间预测方法,求得当前帧的估计值。

一、运动估计

大多数视频序列中,相邻图像内容非常相似,其背景画面变化极小,因此不需要对每幅图像的全部信息都进行编码,而只需要将将当前图像中运动物体的运动信息传给解码器,利用前一图像内容以及当前图像的运动信息即可恢复当前图像,这样可以有效的节省比特率。 
HM中的运动估计可见http://blog.csdn.net/lin453701006/article/details/73695774

1.运动估计准则

常用的匹配准则主要有最小均方误差(MSE)、最小平均绝对误差(MAD)、最大匹配像素数(MPC)等。为了简化计算,一般使用绝对误差和SAD来代替MAD 。编码器为每个运动矢量计算拉格朗日代价,选择代价最小的MV作为当前块的最终MV。

2.搜索算法

在基于块运动补偿的视频编码结构中,运动搜索是最为重要的环节之一,同时也是最耗时的模块。 
HEVC中给出了两种搜索算法:1.全搜索算法 2.TZSearch算法。

全搜索算法,效果最佳,但复杂度太高,实际中采用快速搜索算法。TZSearch算法是HEVC中出现的新技术,与全搜索算法相比,性能略有降低,而搜索时间大大降低,仅为全搜索算法的1/5。

TZSearch算法: 
1.确定起始搜索点。HEVC中采用AMVP技术来确定起始搜索点,AMVP会给出若干个候选预测MV,编码器从中选择率失真代价最小的作为预测MV,并用其所指向的位置作为起始搜索点。 
2.以步长1开始,按下图所示的菱形模板在搜索范围内进行搜索,其中步长以2的整数次幂的形式递增,选出率失真代价最小的点作为该步骤的搜索结果。 
这里写图片描述 
3.若步骤2选出的最优点对应的步长为1,则需要在该点周围进行二点搜索,目的是补充搜索最优点周围尚未搜索的点。例如,如果0上侧的1是最优点,则需要对图中的搜索两个黑块。 
4.若步骤2选出的最优点对应的步长大于某个阈值,则以该最优点为中心,在一定范围内做全搜索(搜索该范围内的所有点),选择率失真代价最小的作为最优点。 
5.以步骤4得到的最优点为起始点,重复步骤2-4,细化搜索。当相邻两次细化搜索得到的最优点一致时停止细化搜索。此时得到的MV即为最终MV。

在看了代码后回头再来补充一点,实际的菱形搜索如下图: 
这里写图片描述
当步长小于等于8时,是进行8点菱形搜索;当步长大于8时,将进行16点菱形搜索。

3.亚像素精度运动估计

实际场景中,物体运动的距离并不一定是像素的整数倍,因此需要将运动估计的精度提升到亚像素级别。HEVC沿用了1/4像素精度运动估计,并使用了更多的邻近像素点进行亚像素精度插值。其中重点是对亮度和色度分量进行插值。

亮度分量插值算法: 
这里直接用到了linpengbin博客的大量图片http://blog.csdn.net/linpengbin/article/details/48005413,感谢大神,小的借用下。 
亮度亚像素插值使用基于离散余弦变换的插值滤波器,抽头系数如下: 
这里写图片描述 
这里写图片描述 
插值过程主要分为两步: 
1.对整数像素所在行或列进行插值。以A(0,0)点附近的亚像素点为例,a(0,0),b(0,0),c(0,0)可以用水平方向的整像素点计算得出,d(0,0),h(0,0),n(0,0)可以用垂直方向上的整像素点计算得出。 
如1/4位置点a(0,0) = -A(-3,0) + 4A(-2,0) -10A(-1,0) + 58A(0,0) + 17A(1,0) - 5A(2,0) + A(3,0) 
2.对剩余亚像素位置进行插值,使用步骤1中已计算得到的亚像素位置计算。 
如e(0,0) = -a(-3,0) + 4a(-2,0) -10a(-1,0) + 58a(0,0) + 17a(1,0) - 5a(2,0) + a(3,0) >>6 
注意,经过亚像素插值后所有像素点都放大了64倍,目的是在中间过程中保持一定精度,在后续的加权预测环节中,会被还原。

色度分量插值算法: 
由于亮度分量运动估计达到了1/4像素精度,因此色度分量运动搜索要达到1/8精度(对YCbCr 4:2:0而言)。使用的是4抽头插值滤波器,插值方法与亮度分量插值类似,没有找到图片,不再具体列举了。

二、MV预测技术

空域上相邻块的MV具有较强的相关性;同时,MV在时域上也具有一定的相关性。可利用空域或时域上相邻块的MV对当前块的MV进行预测,仅对预测残差编码,能够大幅节省MV的编码比特数。

HEVC中提出了Merge和AMVP技术,都使用了空域和时域MV预测思想,通过建立候选MV列表,选取性能最优的一个作为当前PU的预测MV。

1.Merge模式

Merge模式会为当前PU建立一个MV候选列表,其中存在5个候选MV(及其对应的参考图像)。遍历这5个候选MV,选取率失真代价最小的作为最优MV。若编解码器依照相同的方式建立候选列表,则编码器只需要传输最优MV在候选列表中的索引即可。 
MV候选列表的构建包含空域和时域两种,而对于B Slice,还包含组合列表的方式。

空域候选列表的建立: 
如下图,空域最多提供4个候选MV,即最多使用图中5个候选块中的4个候选块的运动信息,列表按照A1-B1-B0-A0-(B2)的顺序建立,其中B2为替补,当A1,B1,B0,A0中只有一个或多个不存在时,需要使用B2的运动信息。 
这里写图片描述 
对于Nx2N、nLx2N或nRx2N的CU划分方式,PU2候选列表中不存在A1,这是由于PU2如果使用A1的信息,则PU1和PU2的MV一致,这与2Nx2N划分方法无异。同理,对于2NxN、2NxnU或2NxnD的CU划分方式,PU2候选列表中不存在B1.

时域候选列表的建立: 
利用当前PU在邻近已编码图像中对应位置PU(同位PU)的运动信息。与空域情况不同,时域候选列表不能直接使用候选块的运动信息,而需要根据参考图像的位置关系做相应的比例伸缩调整。 
cur_PU表示当前PU,col_PU表示同位PU,td和tb分别表示当前图像cur_pic、同位图像col_pic与二者参考图像cur_ref、col_ref之间的距离,则当前PU的时域候选MV为:curMV = (td/tb)*colMV 
HEVC中规定时域最多只提供一个候选MV,由下图H位置同位PU的MV伸缩得到。若H位置同位PU不可用,则用C3位置的同位PU进行替换。 
这里写图片描述 
若当前MV候选列表中候选MV数量不足5个,则使用(0,0)进行填补达到规定数量。

组合列表的建立: 
对于B Slice的PU而言,由于存在两个MV,因此其MV候选列表也需要提供两个预测MV。将前4个候选MV进行两两组合,产生B Slice的组合列表。注意一个候选MV对应的两个MV不能相同。

HM代码中的merge代码分析可见: 
http://blog.csdn.net/lin453701006/article/details/78553545 
merge候选列表建立代码分析可见: 
http://blog.csdn.net/lin453701006/article/details/78573347

2.AMVP技术

利用空域、时域上运动向量的相关性,为当前PU建立候选预测MV列表。编码器从中选择最优的预测MV进行差分编码;解码端通过建立相同的列表,仅需要运动向量残差(MVD)与预测MV在该列表中的序号即可计算当前PU的MV。AMVP的候选列表长度为2。

空域列表的建立: 
AMVP使用当前PU左侧和上方各产生一个候选预测MV,如空域候选列表图,左侧选择顺序是A0-A1-scaled A0-scaled A1,上方选择顺序为B0-B1-B2(-scaled B0-scaled B1-scaled B2)。对于上方MV选择,只有当左侧两个PU都不可用或都是帧内预测模式时才会使用比例伸缩。当左侧或上方检测到第一个可用MV时,直接使用该MV作为当前PU的候选MV,停止剩余步骤。只有当候选MV对应的参考图像与当前PU相同时,该候选MV才能被标记为可用;否则需要进行对应的比例伸缩。

时域列表的建立: 
AMVP时域MV候选列表的建立方法与Merge模式相同,最终MV候选列表长度为2,不足时用(0,0)填补。

AMVP MV候选列表建立过程如图: 
这里写图片描述

HM代码中的AMVP整体分析可见: 
http://blog.csdn.net/lin453701006/article/details/72842344 
候选列表建立代码分析可见: 
http://blog.csdn.net/lin453701006/article/details/78419479

3.Merge和AMVP的区别

1.Merge可以看成一种编码方式,在该模式下,当前PU的MV直接由空域或时域上邻近PU预测得到,不存在MVD;而AMVP可以看成一种MV预测技术,编码器只需要对实际MV与预测MV的差值进行编码,因此是存在MVD的。 
2.二者候选列表长度不同,构建方式也有区别。

三、帧间预测主要模式和三种运动矢量

HEVC中存在MV、MVD、MVP三种运动矢量信息,简单来说,在实际帧间预测中,会首先提供一个MVP,在这个MVP的基础上通过ME找到最优MV,最后计算MVD=MV-MVP,得到要传输的MVD。详细介绍见http://blog.csdn.net/lin453701006/article/details/74012420

第一部分运动估计介绍的运动搜索实际找到的是MV,这一部分HEVC沿用了H.264/AVC的技术,变化不大。第二部分MV预测技术介绍的AMVP,会构造一个候选列表,最终会从这个列表中找到最优MVP。

这样来看,AMVP实际是改进了MV的预测机制,为当前PU构造了MVP候选列表,之前H.264中使用的是中值预测。然后在AMVP构造的MVP候选列表的基础上,进行ME,最后找到最优MVP和MV,计算MVD。

那Merge是怎么一回事呢?Merge和AMVP类似,也是为当前PU构造一个MVP候选列表,但Merge会直接使用这些MVP候选作为MV,可以理解为直接借用空域或时域邻近PU的MV作为当前PU的MV,因此不需要ME,此时MVP和MV相同,没有MVD。

而在帧间预测中还需要提到一个模式skip,是merge模式的一种特例。merge模式找到MV后,如果编码器根据某种方法判断了当前块和参考块基本一样,那么不需要传输残差数据,只需要传送MV的索引和一个skip flag。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的MATLAB代码示例,用于实现HEVC的帧内预测: ```matlab function [predBlock] = intra_predict(image, blockSize, row, col, mode) % image: 输入图像 % blockSize: 块大小 % row, col: 当前块的起始行和列 % mode: 帧内预测模式 % 获取参考像素 switch(mode) case 0 % 模式0:DC预测 refBlock = image(row:blockSize + row - 1, col:blockSize + col - 1); p = mean2(refBlock); predBlock = ones(blockSize, blockSize) * p; case 1 % 模式1:水平预测 refBlock = image(row:blockSize + row - 1, col - 1); predBlock = repmat(refBlock, [1, blockSize]); case 2 % 模式2:垂直预测 refBlock = image(row - 1, col:blockSize + col - 1); predBlock = repmat(refBlock, [blockSize, 1]); case 3 % 模式3:左上角预测 refBlock = image(row - 1, col - 1); predBlock = ones(blockSize, blockSize) * refBlock; case 4 % 模式4:右上角预测 refBlock = image(row - 1, col + blockSize); predBlock = ones(blockSize, blockSize) * refBlock; case 5 % 模式5:左下角预测 refBlock = image(row + blockSize, col - 1); predBlock = ones(blockSize, blockSize) * refBlock; case 6 % 模式6:垂直右下预测 refBlock1 = image(row - 1, col + blockSize); refBlock2 = image(row - 2, col + blockSize); refBlock3 = image(row - 3, col + blockSize); refBlock4 = image(row - 4, col + blockSize); refBlock5 = image(row - 5, col + blockSize); refBlock6 = image(row - 6, col + blockSize); refBlock7 = image(row - 7, col + blockSize); refBlock = (refBlock1 + 2 * refBlock2 + 3 * refBlock3 + 4 * refBlock4 + 5 * refBlock5 + 6 * refBlock6 + 7 * refBlock7 + 8) / 16; predBlock = ones(blockSize, blockSize) * refBlock; case 7 % 模式7:水平右下预测 refBlock1 = image(row + blockSize, col - 1); refBlock2 = image(row + blockSize, col - 2); refBlock3 = image(row + blockSize, col - 3); refBlock4 = image(row + blockSize, col - 4); refBlock5 = image(row + blockSize, col - 5); refBlock6 = image(row + blockSize, col - 6); refBlock7 = image(row + blockSize, col - 7); refBlock = (refBlock1 + 2 * refBlock2 + 3 * refBlock3 + 4 * refBlock4 + 5 * refBlock5 + 6 * refBlock6 + 7 * refBlock7 + 8) / 16; predBlock = ones(blockSize, blockSize) * refBlock; end end ``` 请注意,此代码仅实现了HEVC的帧内预测的一些基本模式,可能需要根据您的特定需求进行更改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值