HEVC函数入门(5)——帧内预测参考数据滤波及总结

本文深入介绍了HEVC帧内预测过程中参考数据的滤波操作,包括滤波目的、条件判断以及不同滤波方式。通过对标准文档的解析,阐述了filterFlag和bInitFlag的设定规则,以及它们如何影响滤波过程。此外,还对HEVC编码流程中的关键步骤进行了简要总结,如CU的压缩和帧内预测的代价计算。
摘要由CSDN通过智能技术生成

这里接着上一篇博客,并且稍微做下总结吧
首先是上篇讲到的滤波
依然是从http://blog.csdn.net/shaqoneal/article/details/39378973参考的

在帧内预测的过程中,获取临近的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]平滑滤波。
代码中的实现方法如下,很容易看出代码的实现和标准文档是匹配的:
我尝试自己找一下这个函数,当然前提是我知道这个函数名字哈哈哈。
首先,直接找fillReferenceSamples,感觉不太对,所以找调用它的initAdiPattern。嗯???我上一个博客好像说过原文是initAdiPattern在我这里是initAdiPatternChType,其实就找到了,和estIntraPredLumaQT在一个文件中也就是TEncSearch.cpp。然后通过initAdiPatternChType找到fillReferenceSamples。恩就这样了。

Void TComPrediction::initAdiPatternChType( TComTU &rTu, Bool& bAbove, Bool& bLeft, const ComponentID compID, const Bool bFilterRefSamples DEBUG_STRING_FN_DECLARE(sDebug))
{
  if (bFi
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值