VVC代码 BMS 帧内预测学习之五:边界值的滤波

8 篇文章 1 订阅
7 篇文章 0 订阅

帧内预测中,对一些涉及边界的模式下得到的帧内预测块,会进行进一步调整,使预测方向即使存在较大变化时,预测信号仍然较为平滑,即保持边界的连续性。
BMS中(目前BMS1.1中边界值滤波操作默认关闭),对采用边界滤波且宽/高均>2的亮度块进行:
注:pSrc指向经过滤波的参考样本的首地址,pDst指向预测块首地址。

1、对模式2,调用函数xIntraPredFilteringMode02()进行滤波。

  • 若高大于2,对上四行像素进行滤波,从上到下系数为[8, 8],[12, 4],[14, 2],[15, 1]:
    p D s t . a t ( x , 0 ) = ( 8 ∗ p D s t . a t ( x , 0 ) + 8 ∗ p S r c . a t ( x + 2 , 0 ) + 8 ) > > 4 pDst.at( x, 0 ) = ( 8 * pDst.at( x, 0 ) + 8 * pSrc.at( x+2, 0 ) + 8) >> 4 pDst.at(x,0)=(8pDst.at(x,0)+8pSrc.at(x+2,0)+8)>>4
    p D s t . a t ( x , 1 ) = ( 12 ∗ p D s t . a t ( x , 1 ) + 4 ∗ p S r c . a t ( x + 3 , 0 ) + 8 ) > > 4 pDst.at( x, 1 ) = ( 12 * pDst.at( x, 1 ) + 4 * pSrc.at( x+3, 0 ) + 8) >> 4 pDst.at(x,1)=(12pDst.at(x,1)+4pSrc.at(x+3,0)+8)>>4
    p D s t . a t ( x , 2 ) = ( 14 ∗ p D s t . a t ( x , 2 ) + 2 ∗ p S r c . a t ( x + 4 , 0 ) + 8 ) > > 4 pDst.at( x, 2 ) = ( 14 * pDst.at( x, 2 ) + 2 * pSrc.at( x+4, 0 ) + 8) >> 4 pDst.at(x,2)=(14pDst.at(x,2)+2pSrc.at(x+4,0)+8)>>4
    p D s t . a t ( x , 3 ) = ( 15 ∗ p D s t . a t ( x , 3 ) + p S r c . a t ( x + 5 , 0 ) + 8 ) > > 4 pDst.at( x, 3 ) = ( 15 * pDst.at( x, 3 ) + pSrc.at( x+5, 0 ) + 8) >> 4 pDst.at(x,3)=(15pDst.at(x,3)+pSrc.at(x+5,0)+8)>>4

  • 若高小于等于2,对上两行进行滤波,系数为[8, 8],[12, 4]。

即:对上四行像素进行滤波。由于为水平类模式,refMain为refLeft,即预测值是根据左侧参考像素获得的。所以令其与参考样本第一行 ( 即refAbove ) 的偏移2的对应位置,按系数比例求得最终滤波值。

2、对模式66,调用函数xIntraPredFilteringMode34()进行滤波;

  • 若宽大于2,对左四列像素进行滤波,从左到右系数为[8, 8],[12, 4],[14, 2],[15, 1]:
    p D s t . a t ( 0 , y ) = ( 8 ∗ p D s t . a t ( 0 , y ) + 8 ∗ p S r c . a t ( 0 , y + 2 ) + 8 ) > > 4 pDst.at( 0, y ) = ( 8 * pDst.at( 0, y ) + 8 * pSrc.at( 0, y+2 ) + 8) >> 4 pDst.at(0,y)=(8pDst.at(0,y)+8pSrc.at(0,y+2)+8)>>4
    p D s t . a t ( 1 , y ) = ( 12 ∗ p D s t . a t ( 1 , y ) + 4 ∗ p S r c . a t ( 0 , y + 3 ) + 8 ) > > 4 pDst.at( 1, y ) = ( 12 * pDst.at( 1, y ) + 4 * pSrc.at( 0, y+3 ) + 8) >> 4 pDst.at(1,y)=(12pDst.at(1,y)+4pSrc.at(0,y+3)+8)>>4
    p D s t . a t ( 2 , y ) = ( 14 ∗ p D s t . a t ( 2 , y ) + 2 ∗ p S r c . a t ( 0 , y + 4 ) + 8 ) > > 4 pDst.at( 2, y ) = ( 14 * pDst.at( 2, y ) + 2 * pSrc.at( 0, y+4 ) + 8) >> 4 pDst.at(2,y)=(14pDst.at(2,y)+2pSrc.at(0,y+4)+8)>>4
    p D s t . a t ( 3 , y ) = ( 15 ∗ p D s t . a t ( 3 , y ) + p S r c . a t ( 0 , y + 5 ) + 8 ) > > 4 pDst.at( 3, y ) = ( 15 * pDst.at( 3, y ) + pSrc.at( 0, y+5) + 8) >> 4 pDst.at(3,y)=(15pDst.at(3,y)+pSrc.at(0,y+5)+8)>>4

  • 若宽小于等于2,对左两列像素进行滤波,从左到右系数为[8, 8],[12, 4]。

即:对左四列像素进行滤波。由于为垂直类模式,refMain为refAbove,即预测值是根据上方参考像素获得的。所以令其与参考样本第一列 ( 即refLeft ) 的偏移2的对应位置,按系数比例求得最终滤波值。

3、对水平类模式>2,<=10 || 垂直类模式>=58,<66,每一类模式下有8个,所以有8组 滤波系数,调用函数xIntraPredFilteringModeDGL()进行滤波。
该函数下设置了两个数组,一个为预测滤波系数,一个为偏移值。

 const Int aucAngPredFilterCoef[8][3] = {
    { 12, 3, 1 }, { 12, 3, 1 },
    { 12, 1, 3 }, { 12, 2, 2 },
    { 12, 2, 2 }, { 12, 3, 1 },
    {  8, 6, 2 }, {  8, 7, 1 },		 };
 `const Int aucAngPredPosiOffset[8][2] = {
    { 2, 3 }, { 2, 3 },
    { 1, 2 }, { 1, 2 },
    { 1, 2 }, { 1, 2 },
    { 1, 2 }, { 1, 2 },		 };

滤波操作为:

Bool bHorz    = (uiMode < DIA_IDX);//判断模式是否为水平类
UInt deltaAng = bHorz ? ((2 + 8) - uiMode) : (uiMode - (VDIA_IDX - 8));//VDIA_IDX = 66

const Int *offset = aucAngPredPosiOffset[deltaAng];//获取偏移值
const Int *filter = aucAngPredFilterCoef[deltaAng];//获取滤波系数

if (bHorz)//水平类,用8举例:deltaAng = 2,offset取{ 1, 2 },filter取{ 12, 1, 3 }
{
  for (x = 0; x < iWidth; x++)
  {
    pDst.at( x, 0 ) = ( filter[0] * pDst.at( x                , 0 )// 12 * pDst.at( x                , 0 )
                      + filter[1] * pSrc.at( x + 1 + offset[0], 0 )//+  pSrc.at( x +2, 0 )
                      + filter[2] * pSrc.at( x + 1 + offset[1], 0 ) + 8 ) >> 4;//+ 3 * pSrc.at( x + 3, 0 ) + 8 ) >> 4
  }
}
else//垂直类,用64举例: deltaAng = 6,offset取{ 1, 2 },filter取{  8, 6, 2 }
{
  for (y = 0; y < iHeight; y++)
  {
    pDst.at( 0, y ) = ( filter[0] * pDst.at( 0,   y )// 8* pDst.at( 0,   y )
                      + filter[1] * pSrc.at( 0, ( y + offset[0] + 1 ) )//+ 6 * pSrc.at( 0, ( y + 2 ) )
                      + filter[2] * pSrc.at( 0, ( y + offset[1] + 1 ) ) + 8 ) >> 4;//+ 2 * pSrc.at( 0, ( y + 3 ) ) + 8 ) >> 4
  }
}

即:
若为水平类:
对上方一行像素进行滤波。令其与参考样本第一行 ( 即refAbove ) 的偏移值的对应位置,按系数比例求得最终滤波值。

若为垂直类:
对左侧一列像素进行滤波。令其与参考样本第一列 ( 即refLeft ) 的偏移值的对应位置,按系数比例求得最终滤波值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值