自适应样点补偿 详细分析解读 .

原文地址:

HEVC中SAO–自适应样点补偿:

本文分三个部分, 1.Sample Adaptive Offset原理, 2.SAO处理流程分析, 3.SAO意义何在!

SAO是在DB之后进行, 输入是重建帧和原始帧数据, 输出是SAO数据和SAO后的重建帧. 自适应样点补偿是一个自适应选择过程,在去块滤波后进行。

下面是整个HEVC的编码框图, 可以看到SAO是在整个帧编码完成后得到重建帧后进行的,属于Slice级别(帧级).

首先把Frame划分为若干LCU, 然后对每个LCU中每个像素进行SAO操作.将根据其LCU像素特征选择一种像素补偿方式,以减少源图像与重构图像之间的失真。自适应样点补偿方式分为带状补偿(Band Offset,BO)和边缘补偿(Edge Offset,EO)两大类。

带状补偿将像素值强度等级划分为若干个条带,每个条带内的像素拥有相同的补偿值。进行补偿时根据重构像素点所处的条带,选择相应的带状补偿值进行补偿。

边缘补偿主要用于对图像的轮廓进行补偿。它将当前像素点值与相邻的2个像素值进行对比,用于比较的2个相邻像素可以在下图中所示的4种模板中选择,,从而得到该像素点的类型。解码端根据码流中标示的像素点的类型信息进行相应的补偿校正。

对每个模板还要确定属于那种类型,类型确定有下面表格来决定.

SAO主函数代码结构如下:主要有3个函数完成所有操作.

Void TEncSampleAdaptiveOffset::SAOProcess()

{…

rdoSaoUnitAll(pcSaoParam, dLambdaLuma, dLambdaChroma, depth);

if (pcSaoParam->bSaoFlag[0])

processSaoUnitAll(saoLcuParam[0], oneUnitFlag[0], 0);

if (pcSaoParam->bSaoFlag[1])

{

processSaoUnitAll(saoLcuParam[1], oneUnitFlag[1], 1);

processSaoUnitAll(saoLcuParam[2], oneUnitFlag[2], 2);

}

}

其中TEncSampleAdaptiveOffset::rdoSaoUnitAll函数完成对整个Frame的所有LCU的YUV进行reset stats和calcSaoStatsCu,以及saoComponentParamDist得到最佳SAO_TYPE选择.最后encodeSaoOffset.

Void TEncSampleAdaptiveOffset::rdoSaoUnitAll()

{ …

for (idxY = 0; idxY< frameHeightInCU; idxY++)

{

for (idxX = 0; idxX< frameWidthInCU; idxX++)

{…

// reset stats Y, Cb, Cr

calcSaoStatsCu(addr, compIdx, compIdx);

saoComponentParamDist();

sao2ChromaParamDist();

for ( compIdx=0;compIdx<3;compIdx++)

encodeSaoOffset(&saoLcuParam[compIdx][addr], compIdx);

// Cost of Merge

}

}

}

下面是子函数的说明:

也就是TEncSampleAdaptiveOffset::calcSaoStatsCuOrg

主要是得到LCU中所有像素各种SAOType的所有信息和状态统计,

分析记录各种SAOType(SAO_EO_0,SAO_EO_1,SAO_EO_2,SAO_EO_3,SAO_BO)以及各种SAOTypeLen和YUV分量对应的m_iOffsetOrg和m_iCount.

iStats = m_iOffsetOrg[0.1.2][0.1.2.3.4]; //YUV and SA0_TYPE

iCount = m_iCount[0.1.2][ 0.1.2.3.4];

如果是BO,通过iClassIdx =m_lumaTableBo[pRec[x]];来确定属于那个条带,并记录iStats[iClassIdx] += (pOrg[x] – pRec[x]);iCount[iClassIdx]++;这里iClassIdx大小为0~32.

明天是世上增值最快的一块土地,因它充满了希望

自适应样点补偿 详细分析解读 .

相关文章:

你感兴趣的文章:

标签云: