几何划分模式 (Geometric partitioning mode ,GPM)原理

针对图像中运动物体的边界部分,VVC采用了几何划分模式进行帧间预测。如下图所示,GPM模式在运动物体的边界处进行了更精细的划分。

划分类型

使用GPM模式时,通过几何定位的直线将CU划分为两部分(下图所示)。 分割线的位置从数学上是根据特定分区的角度参数φ 和偏移参数ρ 得出的,如下图所示。

VVC标准中的GPM规定将360°不等间隔的量化出24种角度,如上图b所示,每种角度下最多有4种偏移,如上图c所示,总共组合出64种划分模式,如下表所示,根据GPM模式索引选择角度和偏移参数。

CU划分后的每个分区都包含单独的运动信息。 每个分区仅允许单向预测,即每个分区仅具有一个运动矢量和一个参考索引,通过该约束,保证了每个CU与传统双向预测相同,即每个CU仅需要两个运动矢量和参考帧索引。 为了简化运动信息编码,GPM两个分区的运动信息使用Merge模式编码,GPM模式的候选列表是由传统的Merge模式推导而来的

对于每个可能的CU尺寸 ,GPM模式总共支持64种分区,其中 ,此外,在长宽比大于4:1或小于1:4的CU上禁用GPM,因为窄CU很少包含几何划分的图案如8x64和64x8。

预测原理

GPM的预测过程如下图所示,当前CU的右侧部分来自参考帧P0的MV0预测,左侧部分来自参考帧P1的MV1预测。

通过使用整数融合矩阵W0和W1执行边缘融合过程来生成最终的GPM预测PG,所述整数融合矩阵W0和W1包含在0到8的值范围内的权重,即

其中

其中,Jw,h 是一个w*h的全1矩阵。融合矩阵的权重取决于样本位置和分割边界之间的位移。下图展示了一组示例混合矩阵。混合矩阵推导的计算复杂度极低,因此这些矩阵可以在解码器端动态生成。

当CU使用GPM模式时,需要进一步用信号指示几何分区的分区模式的几何分区索引(角度和偏移),以及两个Merge索引(每个分区一个)。最大GPM候选大小的数目在SPS中显式表示,并指定GPM Merge索引的语法二值化。在预测完划分后的每个分区后,使用第二节中的具有自适应权重的混合处理来调整沿几何分区边缘的样本值。然后对整个CU进行变换和量化过程。最后,使用几何分区模式预测的CU运动场以第三节描述的方式存储。

单向预测候选列表的构建

单向预测候选列表直接从扩展Merge预测过程构造的Merge候选列表中得出。将GPM单向预测候选列表中的单向预测运动的索引表示为n,将第n个扩展Merge候选的LX运动矢量(X等于n的奇偶校验)作为GPM模式的第n个单向预测运动矢量,即下图中用“ x”标记的运动矢量。如果扩展Merge候选索引n的对应LX运动矢量不存在,则将Merge索引n的L(1- X)运动矢量作为GPM模式的单向预测运动矢量。

GPM单向预测候选列表构建代码及注释如下所示:(基于VTM10.0)

// 获得Geo Merge候选列表
void PU::getGeoMergeCandidates( const PredictionUnit &pu, MergeCtx& geoMrgCtx )
{MergeCtx tmpMergeCtx;const uint32_t maxNumMergeCand = pu.cs->sps->getMaxNumMergeCand();geoMrgCtx.numValidMergeCand = 0;// 初始化GEO Merge列表for (int32_t i = 0; i < GEO_MAX_NUM_UNI_CANDS; i++){geoMrgCtx.BcwIdx[i] = BCW_DEFAULT;geoMrgCtx.interDirNeighbours[i] = 0;geoMrgCtx.mrgTypeNeighbours[i] = MRG_TYPE_DEFAULT_N;geoMrgCtx.mvFieldNeighbours[(i << 1)].refIdx = NOT_VALID;geoMrgCtx.mvFieldNeighbours[(i << 1) + 1].refIdx = NOT_VALID;geoMrgCtx.mvFieldNeighbours[(i << 1)].mv = Mv();geoMrgCtx.mvFieldNeighbours[(i << 1) + 1].mv = Mv();geoMrgCtx.useAltHpelIf[i] = false;}PU::getInterMergeCandidates(pu, tmpMergeCtx, 0); //获得Merge候选列表for (int32_t i = 0; i < maxNumMergeCand; i++) //遍历Merge候选列表{int parity = i & 1;// 奇偶检验if( tmpMergeCtx.interDirNeighbours[i] & (0x01 + parity) ){geoMrgCtx.interDirNeighbours[geoMrgCtx.numValidMergeCand] = 1 + parity;geoMrgCtx.mrgTypeNeighbours[geoMrgCtx.numValidMergeCand] = MRG_TYPE_DEFAULT_N;geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].mv = Mv(0, 0);geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].mv = tmpMergeCtx.mvFieldNeighbours[(i << 1) + parity].mv;geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].refIdx = -1;geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].refIdx = tmpMergeCtx.mvFieldNeighbours[(i << 1) + parity].refIdx;geoMrgCtx.numValidMergeCand++;if (geoMrgCtx.numValidMergeCand == GEO_MAX_NUM_UNI_CANDS)  //Geo Merge列表填满{return;}continue;}if (tmpMergeCtx.interDirNeighbours[i] & (0x02 - parity)){geoMrgCtx.interDirNeighbours[geoMrgCtx.numValidMergeCand] = 2 - parity;geoMrgCtx.mrgTypeNeighbours[geoMrgCtx.numValidMergeCand] = MRG_TYPE_DEFAULT_N;geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].mv = tmpMergeCtx.mvFieldNeighbours[(i << 1) + !parity].mv;geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].mv = Mv(0, 0);geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].refIdx = tmpMergeCtx.mvFieldNeighbours[(i << 1) + !parity].refIdx;geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].refIdx = -1;geoMrgCtx.numValidMergeCand++;if (geoMrgCtx.numValidMergeCand == GEO_MAX_NUM_UNI_CANDS){return;}}}
}

沿几何分割边缘融合(Blending along the geometric partitioning edge)

在几何划分的两个分区使用各自的运动信息获得预测信号后,需要对两个预测信号进行加权混合,以获得几何划分边缘周围的样本。CU划分边缘的各个位置的混合权重是根据各个位置与划分边缘之间的距离得出的。

位置(x,y)到划分边缘的距离为:

其中i,j是几何分区的角度和偏移的索引,取决于信号通知的几何分区索引。ρx,jρy,j 的符号取决于角度索引i。

几何分区各部分的权重如下:

partIdx取决于角度索引i。下图中说明了一个权重w0 的例子。

GPM模式的运动场存储

GPM是以4×4的子块为基本单位进行运动信息的存储,利用每个4×4子块中心像素点的权重来判断存储MV的类型(双向MV还是单向MV:几何划分的第一分区的Mv1、第二分区的Mv2以及Mv1和Mv2的组合Mv)。

运动场中每个单独位置的存储的运动矢量类型被确定为:

其中motionIdx等于d(4x+2,4y+2)。partIdx取决于角度索引i。

如果sType等于0或1,则在相应的运动场中存储Mv0或Mv1,否则如果sType等于2,则存储Mv0和Mv2的组合Mv。组合Mv使用以下过程生成:

1) 如果Mv1和Mv2来自不同的参考帧列表(一个来自L0,另一个来自L1),则Mv1和Mv2简单地组合以形成双预测运动矢量。

2) 否则,如果Mv1和Mv2来自同一列表,则仅存储单预测运动Mv2。

GPM模式的细节参考论文:Geometric Partitioning Mode in Versatile Video Coding: Algorithm Review and Analysis

GPM在VTM10.0中的模式决策位于xCheckRDCostMergeGeo2Nx2N函数中

H.266/VVC帧间预测技术学习:几何划分模式(Geometric partitioning mode, GPM)相关推荐

  1. H.266/VVC帧间预测技术学习:带有运动矢量差的Merge技术(Merge mode with MVD)

    在VVC的扩展Merge模式当中,当前CU生成的Merge list中选择一个率失真代价值最小的候选项直接作为自己的运动信息.除了常规Merge模式,VVC还引入了带运动矢量差(Merge mode ...

  2. H.266/VVC帧间预测技术学习:高级运动矢量预测(Advanced Motion Vector Prediction, AMVP)

    高级运动矢量预测模式(Advanced Motion Vector Prediction,AMVP) AMVP模式是H.265/HEVC中提出的新的MV预测技术,H.266/VVC仍采用了该技术,并在 ...

  3. H.266/VVC帧间预测技术学习:帧间和帧内联合预测(Combined inter and intra prediction, CIIP)

    在HEVC中一个CU在预测时要么使用帧内预测要么使用帧间预测,二者只能取其一.而VVC中提出的CIIP技术,是将帧间预测信号与帧内预测信号相结合. 在VVC中,当CU以Merge模式编码时,且CU包含 ...

  4. H.266/VVC帧间预测技术学习:CU级双向加权预测(Bi-prediction with CU-level weight)

    CU级双向加权预测(Bi-prediction with CU-level weight ,BCW) 在HEVC中,通过对从两个不同参考图片获得的两个预测信号求平均和/或使用两个不同运动矢量来生成双向 ...

  5. H.266/VVC帧间预测技术学习:解码端运动矢量细化(Decoder side motion vector refinement, DMVR)

    解码端运动矢量细化(Decoder side motion vector refinement, DMVR) 为了提高Merge模式的MV的准确性,在VVC中使用了基于双边匹配(BM)的解码端运动矢量 ...

  6. H.266/VVC帧间预测技术学习:双向光流技术(Bi-directional optical flow, BDOF)

    双向光流技术(Bi-directional optical flow,BDOF ) VVC中采用了双向光流技术来修正双向预测的像素值.BDOF以前被称为BIO,包含在JEM参考软件中.与JEM中的版本 ...

  7. H.266/VVC帧间预测总结

    一.帧间预测基本原理 帧间预测是利用视频帧与帧之间的相关性,去除视频帧间的时间冗余信息.统计表明,帧间差绝对值超过3的像素平均不到一帧像素的4%,因此,采用高效的帧间编码方式,可以很大程度上提高视频压 ...

  8. 【十三】 H.266/VVC | 帧间预测技术 | 解码端运动向量修正技术(DMVR)

    目的:为了提高merge模式下双向预测MV的准确性 基本思路:双向预测是在list0和list1中分别寻找一个运动向量,然后将MV0和MV1所指向的预测块进行加权得到最终预测块,而DMVR技术不是直接 ...

  9. DCC2020:VVC帧间预测中的几何划分

    本文来自DCC2020论文<Advanced Geometric-based Inter Prediction for Versatile Video Coding> 几何划分相较于三角划 ...

最新文章

  1. linux c 内存共享
  2. php new httprequest,php安装HTTP_Request2及引用介绍(通过HTTP_Request创建微软人脸识别的群组 为例)...
  3. 今天仔细学习了html加载执行的顺序
  4. 5g虚拟技术旅游_5G赋能VR产业变革
  5. linux系统添加程序,Linux添加系统服务小程序
  6. mac环境下node.js和phonegap/cordova创建ios和android应用
  7. 安装Quagga路由软件
  8. [转]impala操作hive数据实例
  9. 【Swift学习】Swift编程之旅---析构方法(十九)
  10. java和eova的关系_eova ,一套jfinal开发框架,方便学习与 Jsp/Servlet 262万源代码下载- www.pudn.com...
  11. 中国电信-应招知识库(专业知识)
  12. cs61b实验记录(八)project 3:BearMaps 基于OSM的伯克利地图web应用
  13. 5G工业无线RTU TG511功能配置
  14. Bootstrap的iCheck插件checkbox和radio
  15. 我人生的两大梦想是: 睡觉睡到自然醒 数钱数到手抽筋
  16. 创维酷开8S70 安卓4.4ROM
  17. 基于gradle构建Java应用程序
  18. 史上最强悍的一张图,没有任何一个中国人能躲得开!
  19. Laravel - 学习/实践
  20. 物联网--按键控制led以及有源蜂鸣器

热门文章

  1. webAPP学习设计:页面模式的设计。
  2. 购置税用计算机怎么算,进口车辆购置税可以通过网络购置税计算器来计算
  3. 为什么你需要企业架构一文,对企业架构在实施上的启示
  4. 【合成孔径雷达】SAR 距离多普勒算法(RD)+ Chirp Scaling算法(CS)+ InSAR干涉SAR人造场景仿真和干涉处理 + PolSAR极化定标【MATLAB】
  5. C语言中删除字符串中一个字母,C程序删除字符串中除字母之外的所有字符
  6. CAD二次开发.net C#实现appload自动加载lsp和vlx程序
  7. Linux网络设备驱动-以太网驱动分析
  8. php 转化为英文月份,php怎么实现月份数字转英文
  9. 思科 Firepower 管理中心 (Firepower Management Center) 7.1.0 下载
  10. 文笔很差系列3 - 知音难觅