【HEVC学习与研究】36、对帧内预测参考数据进行滤波处理

在帧内预测的过程中,获取临近的Prediction Unit的边缘数据作为当前PU的参考数据。数据获取完成后,并不一定会直接使用这些数据进行预测,而可能会先将这些预测数据进行一次滤波操作。帧内参考像素的滤波在标准文档的8.4.4.2.3节详述。

帧内参考像素的滤波使能标记由一个标志位filterFlag标识。该标志位的判定方法为:

1、如果当前预测模式为DC模式,或者帧内预测的PU为4×4大小时,filterFlag一律为0;

2、计算当前的Intra预测模式同“水平”和“垂直”预测模式的index之间的差值;将这个差值同针对不同大小PU所分别设定的阈值(对于8×8PU为7,对于16×16PU为1,对于32×32PU为0)进行比较,如果大于阈值则filterFlag为1,否则为0。

思想:对于角度预测而言,该算法的目的是对不同的PU大小和预测方向进行区分,越小的PU越不需要滤波,越接近于“水平”和“垂直”的预测模式越不需要滤波。也就是说,4×4PU全不需要滤波,8×8PU只有接近于对角线的部分模式需要滤波,16×16PU除了水平和垂直模式其他都需要滤波,而32×32PU全部必须进行滤波处理。

当设定为需要滤波时,滤波操作根据一个开关变量bInitFlag又有所区分。bInitFlag的判定方法如下:

1、SPS中指定的一个设置位strong_intra_smoothing_enabled_flag设置为1,并且PU大小为32×32,并且指定参考点数据之间的差值不是很大(具体的判定方法见标准文档)的时候,该标志位设为1;

2、其他情况下,该标志位设为0。

设定bInitFlag完成后,根据该标识取值,滤波过程分为两种不同情况:

1、当bInitFlag取1时,缓存区中两个端点和中心店不进行滤波,其他值根据距离这三个点的距离不同进行加权平均滤波;

2、当bInitFlag取0时,缓存区中的相邻数据进行[1,2,1]平滑滤波。

代码中的实现方法如下,很容易看出代码的实现和标准文档是匹配的:

Void TComPattern::initAdiPattern( TComDataCU* pcCU, UInt uiZorderIdxInPart, UInt uiPartDepth, Int* piAdiBuf, Int iOrgBufStride, Int iOrgBufHeight, Bool& bAbove, Bool& bLeft, Bool bLMmode )
{
//......
if (pcCU->getSlice()->getSPS()->getUseStrongIntraSmoothing())
  {
    Int blkSize = 32;
    Int bottomLeft = piFilterBuf[0];
    Int topLeft = piFilterBuf[uiCuHeight2];
    Int topRight = piFilterBuf[iBufSize-1];
    Int threshold = 1 << (g_bitDepthY - 5);
    Bool bilinearLeft = abs(bottomLeft+topLeft-2*piFilterBuf[uiCuHeight]) < threshold;
    Bool bilinearAbove  = abs(topLeft+topRight-2*piFilterBuf[uiCuHeight2+uiCuHeight]) < threshold;

    if (uiCuWidth>=blkSize && (bilinearLeft && bilinearAbove))
    {
      Int shift = g_aucConvertToBit[uiCuWidth] + 3;  // log2(uiCuHeight2)
      piFilterBufN[0] = piFilterBuf[0];
      piFilterBufN[uiCuHeight2] = piFilterBuf[uiCuHeight2];
      piFilterBufN[iBufSize - 1] = piFilterBuf[iBufSize - 1];
      for (i = 1; i < uiCuHeight2; i++)
      {
        piFilterBufN[i] = ((uiCuHeight2-i)*bottomLeft + i*topLeft + uiCuHeight) >> shift;
      }

      for (i = 1; i < uiCuWidth2; i++)
      {
        piFilterBufN[uiCuHeight2 + i] = ((uiCuWidth2-i)*topLeft + i*topRight + uiCuWidth) >> shift;
      }
    }
    else
    {
      // 1. filtering with [1 2 1]
      piFilterBufN[0] = piFilterBuf[0];
      piFilterBufN[iBufSize - 1] = piFilterBuf[iBufSize - 1];
      for (i = 1; i < iBufSize - 1; i++)
      {
        piFilterBufN[i] = (piFilterBuf[i - 1] + 2 * piFilterBuf[i]+piFilterBuf[i + 1] + 2) >> 2;
      }
    }
  }
  else
  {
    // 1. filtering with [1 2 1]
    piFilterBufN[0] = piFilterBuf[0];
    piFilterBufN[iBufSize - 1] = piFilterBuf[iBufSize - 1];
    for (i = 1; i < iBufSize - 1; i++)
    {
      piFilterBufN[i] = (piFilterBuf[i - 1] + 2 * piFilterBuf[i]+piFilterBuf[i + 1] + 2) >> 2;
    }
  }
//......
}
时间: 2024-08-03 04:32:01

【HEVC学习与研究】36、对帧内预测参考数据进行滤波处理的相关文章

【HEVC学习与研究】35、帧内预测参考数据的获取和滤波处理

帧内预测的参考像素值的获取在标准文档的8.4.4.2.2中指明. 举例说明,当前demo中,我们用来单步调试的第一个CU为64×64像素大小,那么参考像素由两部分组成,一部分包含2×64+1=129个,另一部分包含2×64=128个像素.这两部分分别作为垂直和水平方向上的预测数据.在编码的过程中,根据预测数据是否可得,共分为两种情况: 第一种:所有的预测数据都不可得.最直观的情况就是一帧数据中的第一个CU,该CU左侧和上方的数据都不存在,如下图所示.此时所有的预测数据都会制定一个默认值,计算方法

【HEVC学习与研究】30、解码Coding Unit数据

一个CU结构可以认为是编码过程中作为实际处理过程的一个单元,标准文档的7.3.8.5节说明了CU的语法结构,如下图: 这个结构中,第一个元素cu_transquant_bypass_flag表示是否跳过scaling和变换过程,如果该元素不存在则默认为0.在xDecodeCU函数中,解析该元素的代码如下: if (pcCU->getSlice()->getPPS()->getTransquantBypassEnableFlag()) { <span style="whit

【HEVC学习与研究】39、HEVC帧内编码的原理和实现(上)

[前面N篇博文都讲了一些HEVC帧内预测的代码结构和简单的方法,但是尚未对整体的算法和实现做一个比较完整的描述.本篇借助参考文献<High Efficiency Video Coding (HEVC) -- Algorithms and Architectures>的相关章节的阅读笔记,对HEVC的帧内预测算法做一个比较完整的阐述.] [摘要]:HEVC的帧内预测的架构分为三个步骤:①构建参考像素数组:②生成预测像素:③后处理操作.HEVC标准将这三个步骤进行了精密设计,以求达到较高的编码效率

【HEVC学习与研究】32、编码一个CU(帧内部分)1

在一个compressSlice()中,在compressCU函数中实现对一个CU的编码,其中主要进行了CU的初始化,以及实际的编码操作. Void TEncCu::compressCU( TComDataCU*& rpcCU ) { // initialize CU data m_ppcBestCU[0]->initCU( rpcCU->getPic(), rpcCU->getAddr() ); m_ppcTempCU[0]->initCU( rpcCU->getP

HEVC算法和体系结构:预测编码之帧内预测

预测编码之帧内预测(Intra-Picture Prediction)         预测编码(Prediction Coding)是视频编码的核心技术之一,指利用已编码的一个或几个样本值,根据某种模型或方法,对当前的样本值进行预测,并对样本真实值和预测值之间的差值进行编码.视频编码器对预测后的残差而不是原始像素值进行变换.量化.熵编码,由此大幅度提高编码效率.         对于视频信号来说,一帧图像内临近像素之间有着较强的空间相关性,即空域冗余:相邻图像之间也有很强的相关性,即时域冗余.

【HEVC学习与研究】34、HEVC参考软件HM中Intra预测参考像素的获取与管理

继续上一个section所讨论的问题.在section 33中讨论了HEVC帧内预测的几种不同模式,代表这几种模式的函数xPredIntraPlanar.xPredIntraAng和xDCPredFiltering调用的位置位于Void TComPrediction::predIntraLumaAng()中,所以也可以说,在一个PU内,函数Void TComPrediction::predIntraLumaAng实现了亮度分量的帧内预测.该函数的实现方法如下: Void TComPredicti

【HEVC学习与研究】37、HM编码器的基本结构2:帧内编码部分的代码骨架

第31篇博文大体介绍了HEVC参考代码HM10的编码器结构,但仅仅停留在compressCU()以上的层次,并未对具体编码的结构做深入解析.在此篇博文中我们依据对视频YUV序列的帧内编码的流程,重新梳理HM编码器的代码结构. 1.编码器的上层结构: 主要包括: 入口点函数main()[创建cTAppEncTop类,解析输入的配置函数,设定时间相关的参数] cTAppEncTop.encode()[对编码器所使用的几个对象进行初始化,分配YUV数据缓存,循环读取YUV文件] m_cTEncTop.

【HEVC学习与研究】38、HEVC编码过程中的块分割结构

[本文主要分为前后两部分,前半部分基本是Vivienne Sze.Madhukar BudagaviGary和J. Sullivan所编著的<High Efficiency Video Coding (HEVC) --Algorithms and Architectures>的第三章前半部分的笔记,后半部分是在HM-10.0中对Intra预测时块分割相应的代码研究.] 0.摘要 在基于块结构的混合编码框架中,每一帧图像被分割成多个像素结构的像素块(block),而一帧图像中多个像素块聚合成为一

hevc帧内预测模式-如何对HEVC帧内预测中的4x4pu预测模式进行修改?

问题描述 如何对HEVC帧内预测中的4x4pu预测模式进行修改? 5C 各位好:请教一个问题,在HEVC的帧内预测过程中,我想要只修改4x4pu的预测模式,其它的CU尺寸(32x32...8x8)不改动,比如其uiBestMode=25,将其改成26,但是后来发现,这样做的话直接会影响原本的LCU的分割和其他尺寸的预测模式,这应该是因为在帧内预测过程中对于一个LCU是递归地经过预测和熵编码来通过其率失真代价确定分割和其预测模式的,不知道我这样理解对不对,应该对于4x4块怎么做?