DCC2020:VVC中的LMCS

528 阅读8分钟

 

​本文来自DCC2020论文《Luma Mapping with Chroma Scaling in Versatile Video Coding》

LMCS(Luma Mapping with Chroma Scaling)主要包括两部分,1)亮度映射,通过充分利用特定位深下的亮度值取值范围提高SDR和HDR视频的压缩效率;2)依赖亮度的色度缩放,主要用于控制亮度和色度分量的相对压缩效率。

LMCS编码工具

LMCS主要包括两个部分:亮度映射(LM)、依赖亮度的色度缩放(CS)。

  • 亮度映射LM

LM的基本思想是在给定位深下充分利用亮度值的取值范围,这是因为一般的视频信号不会取完取值空间的所有值。例如ITU-R BT.2100-2(回复BT2100可获取)中对10bit视频的亮度窄范围取值为64到940。LM在像素级进行操作。

  • 色度缩放CS

在VVC中,色度的QP依赖于对应亮度的QP,当使用LM之后映射域的亮度值和原始信号域的亮度值可能不同,所以对应色度QP可能不是最优的。所以LMCS中通过依赖亮度值的色度缩放解决这个问题。CS在色度块级进行操作。

Fig.1是LMCS的解码流程,上边是CS部分,下边是LM部分。蓝色框的操作是在映射域进行。黄色框包括前向映射、逆映射、色度缩放操作。无色框表示在原始信号域的操作。

当开启LMCS功能后亮度分量解码过程如下:

  1. 反量化和反变换,生成映射域的亮度残差值Y'res。
  2. 将残差值Y‘res和对应的映射域预测值Y'pred相加得到映射域重建值Y'r。对于帧内预测,Y'pred完全通过映射域内的亮度值得到。对于帧间预测,需要将原始信号域的预测值Ypred映射为Y'pred。
  3. 将重建值Y'res进行逆映射,然后进行环路滤波,结果送入DPB。
  4. DPB中的像素值都是在原始信号域。

当开启LMCS功能后色度分量解码过程如下:

  1. 反量化和反变换,生成映射域的色度残差值C_resscale。对于色度而言,映射操作即在编码过程中对色度残差进行缩放,缩放因子为cScaleInv,其倒数在编码过程中需要用到。对于同一个色度块cScaleInv是相同的。
  2. 为了减少流水线延迟,cScaleInv使用当前VPDU的上边和/或左侧亮度像素重建值的均值avgY'r生成。
  3. 为了降低复杂度,需要做出下面的限制。如果当前CU是帧间128x128、帧间128x64、帧间64x128,第一个VDPU的cScaleInv用于CU所有的色度块。此外,对于小于等4的色度块不进行缩放。

亮度映射操作

亮度映射通过一个前向映射函数FwdMap实现,其对应的逆向映射函数为InvMap。FwdMap是一个分段线性模型,需要在码流中传输,而InvMap不需要在码流中传输解码器可以通过FwdMap生成InvMap函数。

FwdMap分段线性模型通过下面方式得到:

  1. 将特定位深视频信号的取值范围划分为16个等长的分段。例如,对于10bit信号划分为16个分段,每个分段包含64个码字。每个分段码字数量用OrgCW表示。
  2. InputPivot[i]=i*OrgCW,i=0,1...16表示原始信号域每个分段的枢轴点。
  3. 在编码过程中可以计算出映射域枢轴点MappedPivot[i]。MappedPivot[i+1]-MappedPivot[i]表示第i个分段在映射域亮度码字数量。
  4. InputPivot[i]和MappedPivot[i]完全确定了FwdMap函数。

假设Y_pred是10bit亮度信号的预测值,其所属的分段i可由Y_pred右移6位得到。Y_pred在映射域对应的值Y'_pred可由下面方式计算,

上式中等号右侧内容即为函数FwdMap(Y_pred)。

用于求得InputPivot[i]和MappedPivot[i]值的参数通过APS(adaptation parameter set)传输,aps_params_type值设置为1。视频序列有4个LMCS APS,但是一个图像仅使用一个LMCS APS。在图像头中有一个标志位表示当前图像是否使用LMCS,如果当前图像使用LMCS则图像头中aps_id表示当前图像使用的APS。

色度缩放操作

色度缩放对于一个色度块的所有残差值都使用同一个缩放因子。编码器使用的缩放因子为C_scale,对应的解码器使用其倒数进行逆缩放C_scaleInv。在编码端C_resScale = C_res * C_scale = C_res / C_scaleInv,在解码端C_res = C_resScale / C_scale = C_resScale * C_scaleInv。

各分段内部C_scaleInv值是相同的,可由分段内映射域码字数量和色度缩放偏移值deltaCRS(通过LMCS APS传输)求得。首先计算当前VPDU上方和/或左侧邻域重建像素的平均值avgY'r。然后计算avgY'r所属的分段i。最后计算第i个分段对应的C_scaleInv,

示例

下面有两个示例演示如何求得LMCS的参数。第一个示例是针对SDR和HDR HLG视频,通过PSNR评价压缩效果。第二个示例针对HDR PQ视频,通过加权PSNR(wPSNR)评价压缩效果。

示例1:SDR和HDR HLG视频的LMCS参数估计

其基本原理是给平坦区域分配更多的码字,非平坦区域更少的码字。LMCS参数估计分为下面4步。

1、初始化时为每个有效分段分配相同数量的码字。

  • 对于不是10bit的信号归一化到10bit。
  • 将码字范围[0,1023]均匀划分为16个分段。
  • 确定有效分段数量,有效指的是该分段中大部分亮度值在图像中出现了。例如,对于10bit窄范围信号,[0,63]和[941,1023]无法取到,则第0和15个分段是无效的,一共有14个有效分段。
  • 对每个有效分段按下面方式分配相同数量的码字。

2、基于图像统计结果调整码字数量。

  • 对于图像中的每个亮度像素,计算以其为中心winSize x winSize邻域内的空域方差pxlVar。其中winSize=Floor(min(width,height)/240)-2+1。width,height是图像宽高。
  • 对于16个分段,计算每个的pxlVar平均对数,binCnt[i]是第i个分段像素数量。

  • 计算所有分段binVar的均值meanVar,和每个分段对应的归一化值normVar[i]=binVar[i]/ meanVar。
  • 调整码字,将更多码字分配给noreVar小的分段,

其中delta1[i]=round(10xhist[i]),delta2[i]=round(20xhist[i])。hist[i]是第i个分段像素数相对于所有像素数的百分比,剪切到[0,0.4]避免过度的码字分配。

3、调整码字数量到最大码字数量。

如果分配的码字数量超过允许的最大数量,从第一分段开始,逐渐减少分配给每个分段的码字数,直到分配的码字总数等于允许的码字总数。

4、设置rate、slice和色度自适应参数。

  • 当编码使用的QP较小(小于等于22)时允许使用rate自适应以保留更多图像细节。当开启rate自适应且有效分段数量小于16时,分配给每个分段的码字数量为66。
  • slice自适应使得上面步骤2、3只能在IRAP图像上进行。可以根据以下选项对slice进行LMCS激活:1)对所有帧内和子序列帧间slices;2)仅对TemporalID=0的子序列的图像的slices;3)仅对子序列帧间slices。对某些视频,其映射域图像的平均方差会大于原始像素域平均方差,且差值超过预定义阈值,此时对帧内slices禁用LMCS压缩效果会更好,或者仅对TemporalID=0的图像的slices使用LMCS。
  • 色度自适应可以根据图像亮度和色度分量的相对平均空域方差决定是否使用色度残差的缩放。如果色度分量和亮度分量的平均空域方差比值超过预定义阈值则不进行色度残差的缩放。

示例2:HDR PQ视频的LMCS参数估计

本示例针对HDR PQ内容提供了一个固定的映射函数,该函数通过luma dQP( luma-dependent quantization adaptation method)建模。luma dQP基于平均亮度值为每个CTU生成局部delta QP(dQP)。

HDR PQ视频使用wPSNR作为客观评价指标,wPSNR通过wSSE(ܻY)计算得到,

HDR PQ的LMCS映射函数通过下面步骤得到:

1、计算映射曲线的斜率:

如果信号是窄范围,对于10bit视频的Y值取值为[0,63]和[940,1023]时斜率设为0。

2、对映射函数斜率积分,Y=0,1...maxY-1,

3、通过将F[Y]归一化到[0,maxY]得到look-up table,FwdLUT[Y]

4、计算每个分段码字数量

实验结果

实验基于VTM6.0平台,配置为RA。实验结果如下:

感兴趣的请关注微信公众号Video Coding