在VVC中,在环路滤波器之前,添加了一种称为色度缩放和亮度映射(LMCS:Luma mapping with chroma scaling)的编码工具。
LMCS有两个主要组成部分:
1)基于自适应分段线性模型的亮度分量的环路映射;
2)对于色度分量,应用依赖于亮度进行色度残差缩放。
1 LMCS体系结构
下图从解码器的角度显示了LMCS体系结构。
1、图中的浅蓝色方框表示在映射域中的处理位置:包括反量化,反变换,亮度帧内预测以及亮度预测与亮度残差的加法运算。
2、图中没有阴影底纹表示在原始域(即不经过映射)中应用处理的位置:包括环路滤波器,运动补偿预测,色度帧内预测,将色度预测与色度残差相加,以及将解码后的图片存储为参考图片。
3、图中的浅黄色方框是新的LMCS功能块,包括亮度信号的正向和反向映射以及与亮度有关的色度缩放过程。
与VVC中的大多数其他工具一样,可以使用SPS标志在序列级别启用或禁用LMCS。
2 分段线性模型的亮度映射(LM:Luma mapping)
亮度分量的环路映射:通过在整个动态范围内重新分配码字来调整输入信号的动态范围,以提高压缩效率。
亮度映射使用前向映射功能FwdMap
和相应的逆向映射功能InvMap
。 FwdMap
函数使用具有16个相等片段的分段线性模型来表示。 InvMap
函数是从FwdMap
函数派生的,不需要发信号。
亮度映射模型在APS语法结构中用aps_params_type
等于1时来发信号(LMCS_APS)。编码的视频序列中最多可以使用4个LMCS_APS,一帧只能使用1个LMCS_APS。
亮度映射模型使用分段线性模型发信号。分段线性模型将输入信号的动态范围划分为16个相等的片段,对于每个片段,其线性映射参数使用分配给该片段的像素值个数表示。(以10比特深度为例。默认情况下,这16个片段中的每个片段都将分配有64个像素值。)
2.1 计算方式
用信号发送的像素值数量,可以用于计算比例因子并相应地调整该片段的映射函数。在slice级,用信号发送LMCS使能标志,以指示是否将LMCS处理应用于当前Slice。如果为当前Slice启用了LMCS,则会在Slice标头中发送aps索引信号,以标识承载亮度映射参数的APS。
FwdMap
分段线性模型的第i个,(i = 0 … 15),由两个输入InputPivot[]
和两个输出(映射)MappedPivot[]
定义。假设10位视频,SignalledCW [i]
是第i个像素值的数量,则输入InputPivot[]
和输出 MappedPivot[]
如下计算:
1、对于帧间编码块,在映射域中执行运动补偿预测。换句话说,在基于DPB中的参考信号计算了运动补偿预测块Y_pred
之后,应用FwdMap
函数将原始域中的亮度预测块映射到映射域,Y’_pred = FwdMap(Y_pred)
。
2、对于帧内编码块,由于在映射域中执行帧内预测,因此不应用FwdMap
函数,在计算了重建块Y之后,应用InvMap
函数将映射域中的重建亮度值转换回在原始域中重建的亮度值(Y_i=InvMap(Y_r)
)。InvMap
函数适用于帧内和帧间编码的亮度块。
2.2 构建LUT
可以使用查找表(LUT)或使用即时计算来实现亮度映射过程(正向和/或反向映射)。
如果使用LUT,则可以预先计算并预先存储FwdMapLUT
和InvMapLUT
以在Tile级别使用,并且向前和反向映射可以简单地应用查表操作,实现为:
同样可以使用即时计算作为备选。以正向映射函数FwdMap
为例。为了找出亮度样本所属的片段,样本值右移了6位(相当于16个相等的片段)。然后,检索该片段的线性模型参数并即时应用以计算映射的亮度值。
令i为片段索引,a1,a2分别为InputPivot[i]
和 InputPivot[i+1]
,b1,b2分别为MappedPivot[i]
和 MappedPivot[i+1]
。 FwdMap
函数的计算如下:
InvMap
函数可以以类似方式即时计算。通常,映射域中的片段大小不相等,因此,最直接的逆映射过程将需要进行比较,以便确定当前样本值属于哪个片段。这样的比较增加了解码器的复杂性。因此,VVC对输出枢轴点MappedPivot[i]
的值施加位流约束,如下所示:
假定映射域的范围(对于10位视频,此范围为[0,1023])分为32个相等的片段。如果MappedPivot[i]
不是32的倍数,则MappedPivot[i+1]
和MappedPivot[i]
不能属于32个相等大小的块中的同一块。例如:
MappedPivot[ i + 1 ] >> ( BitDepthY – 5)
不应等于MappedPivot[ i ] >> ( BitDepthY – 5)
。
由于这种位流约束,InvMap
函数也可以使用简单的右移5位来执行。 (对应于32个相等大小的片段),以便找出样本值所属的片段。
3 与亮度相关的色度残差缩放(CS:chroma scaling)
色度残差缩放设计用于补偿亮度信号及其相应色度信号之间的相互作用。
色度残差缩放是否启用也通过slice级别发出信号。如果启用了亮度映射,则会发信号通知一个附加标志,以指示是否启用了亮度相关色度残差缩放。不使用亮度映射时,将禁用与亮度有关的色度残留缩放。此外,对于面积小于或等于4的色度块,始终禁用与亮度相关的色度残差缩放功能。
色度残差缩放取决于当前VPDU顶部和/或左侧重建的相邻亮度的平均像素值。如果当前CU在帧间128x128,帧间128x64和帧间64x128之间,则针对与第一VPDU相关联的CU导出的色度残余缩放比例因子用于该CU中的所有色度TU。将avgYr
表示为重建的相邻亮度的平均像素值。 C_ScaleInv
的值按以下步骤计算:
1)根据InvMap
函数找到avgYr
所属的分段线性模型的索引 Y_Idx
。
2)C_ScaleInv = cScaleInv[Y_Idx]
,其中 C_ScaleInv[]
是基于SignalledCW [i]
的值和APS中汇总的偏移值(用于色度残留缩放处理)预先计算的16个值的LUT。
与基于采样执行的亮度映射不同,C_ScaleInv[]
是整个色度块的恒定值。使用C_ScaleInv[]
时,色度残差缩放按以下方式计算:
4 编码器端LMCS参数估计
VTM编码器中提供了一个非标准参考实现,以估算LMCS模型参数。由于VTM对SDR,HDR PQ和HDR HLG的处理方式不同,因此VTM7.0中的参考算法针对SDR,HDR PQ和HDR HLG序列的设计也有所不同。
1、对于SDR和HDR HLG序列,编码器算法基于局部亮度方差,针对PSNR指标进行了优化。
2、对于HDR PQ序列,编码器算法基于亮度值,针对wPSNR(加权PSNR)指标进行了优化。