적응 형 QP (Adaptive QP)

적응 형 QP

적응 형 QP는 코딩 품질을 향상시키기 위해 각 CU에 대해 QP를 적응 적으로 선택하는 것입니다. 구성 매개 변수 AdaptiveQP는이 기능을 사용할지 여부를 지정합니다. 기본적으로 켜져 있지 않습니다.

("AdaptiveQP,-aq", m_bUseAdaptiveQP,false, "QP adaptation based on a psycho-visual model")

QP 계산 원리는 플랫 블록에는 더 작은 QP를 선택하고 활동이 더 많은 블록에는 더 큰 QP를 선택하는 것 입니다.

CU의 활동은 휘도 성분의 분산으로 계산됩니다. 예를 들어 2Nx2N CU의 경우 먼저 4 개의 NxN 휘도 하위 블록의 분산을 계산 한 다음 분산에서 CU의 활동 actcu를 계산합니다.

 

활동이 많은 영역에서 더 큰 QP를 사용하고 평평한 영역에서 더 작은 QP를 사용하려면 이미지에서 각 2Nx2N CU의 actcu를 정규화해야합니다. 이미지 f의 모든 2Nx2N CU의 평균 활동이 actf라고 가정하면 정규화 된 norm_actcu는 다음과 같이 계산됩니다.

 

QPA는 구성 매개 변수 MaxQPAdaptationRange에 의해 지정되며 기본값은 6입니다.

  ("MaxQPAdaptationRange,-aqr",m_iQPAdaptationRange,6, "QP adaptation range")

CU의 최종 QP는 다음과 같이 계산됩니다.

 

참고 : 구성 파일의 MaxCuDQPDepth 매개 변수는 Adaptive QP를 사용할 수있는 최소 CU 크기를 지정하며 기본값은 0입니다. 값은 최대 CU 깊이보다 작아야합니다.

다음 코드는 HM에서 Adaptive QP의 계산 프로세스입니다.

/** Compute QP for each CU
 * \param pcCU Target CU
 * \param uiDepth CU depth
 * \returns quantization parameter
 */
Int TEncCu::xComputeQP( TComDataCU* pcCU, UInt uiDepth )
{
  Int iBaseQp = pcCU->getSlice()->getSliceQp();
  Int iQpOffset = 0;
  if ( m_pcEncCfg->getUseAdaptiveQP() )
  {
    TEncPic* pcEPic = dynamic_cast<TEncPic*>( pcCU->getPic() );
    UInt uiAQDepth = min( uiDepth, pcEPic->getMaxAQDepth()-1 );
    TEncPicQPAdaptationLayer* pcAQLayer = pcEPic->getAQLayer( uiAQDepth );
    UInt uiAQUPosX = pcCU->getCUPelX() / pcAQLayer->getAQPartWidth();
    UInt uiAQUPosY = pcCU->getCUPelY() / pcAQLayer->getAQPartHeight();
    UInt uiAQUStride = pcAQLayer->getAQPartStride();
    TEncQPAdaptationUnit* acAQU = pcAQLayer->getQPAdaptationUnit();
​
    Double dMaxQScale = pow(2.0, m_pcEncCfg->getQPAdaptationRange()/6.0); //!<缩放因子s
    Double dAvgAct = pcAQLayer->getAvgActivity();  //!<平均活动性
    Double dCUAct = acAQU[uiAQUPosY * uiAQUStride + uiAQUPosX].getActivity();
    Double dNormAct = (dMaxQScale*dCUAct + dAvgAct) / (dCUAct + dMaxQScale*dAvgAct); //!<归一化
    Double dQpOffset = log(dNormAct) / log(2.0) * 6.0; //!<换底公式
    iQpOffset = Int(floor( dQpOffset + 0.49999 ));
  }
​
  return Clip3(-pcCU->getSlice()->getSPS()->getQpBDOffset(CHANNEL_TYPE_LUMA), MAX_QP, iBaseQp+iQpOffset );
}

관심이 있으시면 WeChat 공개 계정 비디오 코딩을 따르십시오.

 

추천

출처blog.csdn.net/Dillon2015/article/details/105265832