Intra Mode Coding With Boundary Prediction Filters

本文介绍了HEVC标准中的边界滤波技术,包括其在不同预测模式下的应用,如DC、垂直和水平模式,并详细解释了针对不同模式的滤波算法。此外,还介绍了JVET中的边界预测滤波器如何扩展了原有技术的应用范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • HEVC boundary filter回顾
    • 仅作用于使用DC(1),vertical(10)和horizontal(26) mode且小于32x32的PU的亮度块的最左侧一列和最上侧一行的参考像素点。
    • 当使用vertical mode时,最左侧一列的值p(0,y)为下式,其中,y属于[0,N-1],其中,N是PU的大小,见标准文档8.4.4.2.6式(8-62):
      p(0,y)=p(0,y) + ((p(-1, y) - p(-1, -1))>>1)
    • 当使用horizontal mode时,最上侧一行的值p(x,0)的滤波处理类似于vertical mode,见标准文档8.4.4.2.6式(8-54)
    • 当使用DC mode时,使用3-tap (1 2 1)/4作用于p(0,0),使用2-tap ( 3 1)/4作用于其余处于边界的预测参考值,如下式所示(标准文档8.4.4.2.5式(8-42,8-43,8-44)),
      p(0,0)=(p(-1, 0) + 2 * dc +p(0, -1)+2)>>2;
      p(x,0)=(p(x,-1)+3*dc+2)>>2;
      p(0,y)=(p(-1,y)+3*dc+2)>>2;
      dc的计算方式见标准文档8.4.4.2.5式(8-41)
  • JVET中的boundary prediction filters
    • 扩展到更多的角度,不再局限于DC,vertical和horizontal
    • 扩展到更多参考像素行,四行或四列。对于mode 2和mode 34,使用2-tap滤波器,对于mode 3-6和30-33使用3-tap滤波器,如下图所示,对于mode 34的最左侧四行分别使用不同的2-tap滤波器,对于mode 30-33的最左侧一行使用3-tap滤波器,
      这里写图片描述
  • JEM代码阅读
    • 见宏VCEG_AZ07_INTRA_65ANG_MODES,以及宏VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE用于对mode2和mode34中额外的边界行进行处理
    • SPS header中添加了m_useIntraBoundaryFilter参数,用于在序列级别决策是否使用该技术,一般情况下打开
    • 关键代码在函数predIntraAng
      //VCEG_AZ07_INTRA_65ANG_MODES,扩展到67个角度后,则相应地将3-6改成3-10,30-33改成58-65,34改成66 
      //关键的函数,xIntraPredFilteringMode34 + xIntraPredFilteringMode02 + xIntraPredFilteringModeDGL
      #if VCEG_AZ07_INTRA_BOUNDARY_FILTER
      else if( enableBoundaryFilter && isLuma(compID) )
      {
      #if VCEG_AZ07_INTRA_65ANG_MODES
      if( uiDirMode == VDIA_IDX )
      #else
      if( uiDirMode == 34 )
      #endif
      {
      xIntraPredFilteringMode34( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight);
      }
      else if( uiDirMode == 2 )
      {
      xIntraPredFilteringMode02( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight);
      }
      #if VCEG_AZ07_INTRA_65ANG_MODES
      else if( ( uiDirMode<=10 && uiDirMode>2 ) || ( uiDirMode>=(VDIA_IDX-8) && uiDirMode<VDIA_IDX ) )
      #else
      else if( ( uiDirMode<=6 && uiDirMode>2 ) || ( uiDirMode>=30 && uiDirMode<34 ) )
      #endif
      {
      xIntraPredFilteringModeDGL( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight, uiDirMode );
      }
      }
      #endif
    • xIntraPredFilteringMode34 ,对最左侧4行进行滤波处理,滤波器参数分别(8 8)/4, (12 4)/4, (14 2)/4, (15 1)/4对应于第1-4行,具体地
       
      for ( Int y = 0, iDstStride2 = 0, iSrcStride2 = -1; y < iHeight; y++, iDstStride2+=iDstStride, iSrcStride2+=iSrcStride )
      {
      pDst[iDstStride2 ] = ( 8 * pDst[iDstStride2 ] + 8 * pSrc[iSrcStride2+iSrcStride ] + 8 ) >> 4;
      #if VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE
      pDst[iDstStride2+1] = ( 12 * pDst[iDstStride2+1] + 4 * pSrc[iSrcStride2+iSrcStride*2] + 8 ) >> 4;
      pDst[iDstStride2+2] = ( 14 * pDst[iDstStride2+2] + 2 * pSrc[iSrcStride2+iSrcStride*3] + 8 ) >> 4;
      pDst[iDstStride2+3] = ( 15 * pDst[iDstStride2+3] + pSrc[iSrcStride2+iSrcStride*4] + 8 ) >> 4;
      #endif
      }
    • xIntraPredFilteringMode02,对最上侧4行进行滤波处理,滤波器参数分别(8 8)/4, (12 4)/4, (14 2)/4, (15 1)/4对应于第1-4行,具体地
       
      for ( Int x = 0; x < iWidth; x++ )
      {
      pDst[x ] = ( 8 * pDst[x ] + 8 * pSrc[x - iSrcStride + 1] + 8 ) >> 4;
      #if VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE
      pDst[x+iDstStride ] = ( 12 * pDst[x+iDstStride ] + 4 * pSrc[x - iSrcStride + 2] + 8 ) >> 4;
      pDst[x+iDstStride*2] = ( 14 * pDst[x+iDstStride*2] + 2 * pSrc[x - iSrcStride + 3] + 8 ) >> 4;
      pDst[x+iDstStride*3] = ( 15 * pDst[x+iDstStride*3] + pSrc[x - iSrcStride + 4] + 8 ) >> 4;
      #endif
      }
    • xIntraPredFilteringModeDGL,对最上侧1行或最左侧1列进行滤波处理,对不同的mode滤波器参数分别设置,具体地见数组aucAngPredFilterCoefaucAngPredPosiOffset
       
      if(bHorz)
      {
      for ( Int x = 0; x < iWidth; x++ )
      {
      pDst[x] = ( filter[0] * pDst[x]+ filter[1] * pSrc[x - iSrcStride + offset[0]] + filter[2] * pSrc[x - iSrcStride + offset[1]] + 8) >> 4;
      }
      }
      else
      {
      for ( Int y = 0; y < iHeight; y++ )
      {
      pDst[y * iDstStride] = ( filter[0] * pDst[y * iDstStride] + filter[1] * pSrc[(y + offset[0] ) * iSrcStride -1 ] + filter[2] * pSrc[(y + offset[1] ) * iSrcStride -1 ] + 8) >> 4;
      }
      }
    • -
<think>嗯,用户问的是关于intra_chroma_lmc_mode的含义或用法,主要是在视频编码或图像处理中的。首先,我需要回忆一下相关的视频编码标准,比如H.265/HEVC或者H.266/VVC。根据用户提供的引用内容,特别是引用[1]和引用[3],看起来这个函数可能和色度分量的帧内预测有关。 首先,用户提供的引用[1]中的代码片段提到,当开启某个功能时(可能是ACT,也就是自适应颜色变换),色度帧内预测模式通过DM(可能是指直接模式,Direct Mode)获得。然后有一个条件判断,检查是否允许使用LM(线性模型)色度模式,即cclm_mode_flag。如果这个标志为真,就调用intra_chroma_lmc_mode函数。这说明intra_chroma_lmc_mode函数是用来处理色度分量的LM模式的。 再结合引用[3],里面提到H.266/VVC的帧内模式编码包括了MIP、MRL、ISP等技术。而LMChroma可能属于其中的一种预测模式,利用亮度分量来预测色度分量,这样可以减少冗余,提高压缩效率。因此,intra_chroma_lmc_mode可能是在VVC标准中用于实现这种线性模型预测的函数。 接下来需要确认LM模式的具体工作原理。通常,LM模式(Luma-to-Chroma Mapping)通过亮度块的信息来推导出色度块的预测值,利用亮度和色度之间的相关性。这可能涉及到线性回归模型,根据亮度的像素值计算出色度的预测值。因此,intra_chroma_lmc_mode函数可能负责计算这些线性模型的参数,或者应用这些参数生成预测块。 另外,引用[2]中的predIntraChromaLM函数可能和intra_chroma_lmc_mode相关,后者可能调用前者来实际生成预测值。比如,在确定使用LM模式后,需要根据亮度分量生成色度的预测块,predIntraChromaLM可能就是这个过程的实现。 用户的问题可能涉及这个函数的具体作用、在编码流程中的位置以及其优势。需要解释LM模式在视频编码中的作用,如何提升压缩效率,以及该函数在编码器中的调用时机和流程。同时,结合用户提供的引用,说明该函数在解析语法元素(如cclm_mode_flag)后的处理步骤。 总结来说,intra_chroma_lmc_mode是VVC中用于色度分量帧内预测的LM模式处理函数,通过亮度信息预测色度,减少冗余,提升编码效率。具体实现可能包括参数计算、预测生成等步骤,并涉及相关的语法元素解析和处理流程。</think>在视频编码标准(如H.266/VVC)中,`intra_chroma_lmc_mode` 是用于色度分量帧内预测的 **线性模型色度模式(LMChroma Mode)** 的实现函数[^1][^3]。以下是其核心含义和技术细节: --- ### **功能定义** 1. **LMChroma模式原理** 该模式利用亮度分量(Luma)的像素值,通过线性回归模型预测色度分量(Chroma),减少亮度和色度之间的空间冗余。公式为: $$ C_{pred}(x,y) = \alpha \cdot L_{rec}(x,y) + \beta $$ 其中,$C_{pred}$ 是色度预测值,$L_{rec}$ 是重建亮度值,$\alpha$ 和 $\beta$ 是模型参数[^3]。 2. **实现流程** - **参数计算**:根据当前块的亮度重建值和色度参考值,通过最小二乘法拟合 $\alpha$ 和 $\beta$。 - **预测生成**:应用线性模型生成色度预测块。 - **语法解析**:解析 `cclm_mode_flag` 标志位判断是否启用此模式[^1][^2]。 --- ### **在编码流程中的作用** 1. **帧内预测模式选择** 当色度预测模式选择逻辑检测到允许使用LM模式(`pu.cu->checkCCLMAllowed()`)时,若解析到 `cclm_mode_flag` 为真,则调用 `intra_chroma_lmc_mode` 生成预测块。 2. **性能优势** - **压缩效率**:通过亮色度相关性减少色度分量编码比特数。 - **复杂度权衡**:相比传统模式,需额外计算模型参数,但总体提升率显著。 --- ### **代码示例(伪代码逻辑)** ```cpp void intra_chroma_lmc_mode(PredictionUnit &pu) { // 1. 获取亮度重建值 L_rec 和色度参考值 C_ref PelBuf L_rec = pu.cs->getRecoBuf(COMPONENT_Y); PelBuf C_ref = pu.cs->getRecoBuf(COMPONENT_Cb); // 2. 计算线性模型参数 α 和 β calculate_alpha_beta(L_rec, C_ref, alpha, beta); // 3. 生成色度预测块 C_pred for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { C_pred[x][y] = alpha * L_rec[x][y] + beta; } } // 4. 存储预测结果供后续编码使用 pu.chromaPred = C_pred; } ``` --- ### **相关引用说明** - 引用:描述了LM模式的条件判断和语法解析流程。 - 引用[^2]:对应实际预测函数 `predIntraChromaLM` 的调用。 - 引用[^3]:解释了LM模式在VVC帧内编码中的技术背景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值