文章目录
简介
环路滤波是混合编码框架中非常重要的一环,其目的为去除重建信号的压缩噪声,提高重建帧的质量,同时提高后续帧的压缩效率。VVC中主要采用了四中环内滤波技术,相比于HEVC中的去块滤波器(DF)和样本自适应偏移滤波器(SAO),还新增加了自适应环路滤波器(ALF)以及LMCS(Luma mapping with chroma scaling)。LMCS之前也被称作自适应环内信号重塑(adaptive in-loop reshaper)。在VTM中四类滤波器的执行顺序为:LMCS — DF — SAO — ALF。按照顺序依次介绍,本文先从LMCS开始。
1. LMCS(Luma Mapping with Chroma Scaling)理论
其实我也不知道该怎么翻译成中文,姑且叫做亮度映射与色度伸缩滤波器吧,后面直接以英文缩写LMCS表示。LMCS是VTM众多环内滤波器第一个,其操作在DF之前,LMCS之前被称为adaptive in-loop reshaper,是针对提高HDR信号的压缩效率而设计的。LMCS主要分成两个部分:(1)基于自适应分段线性模型的环内亮度映射;(2)色度残差的亮度依赖性尺度伸缩。
下图给出了解码端中LMCS框架,途中有三种背景的流程框:(1)蓝色的流程框表示信号在映射域的操作,包括亮度的反变换、反量化、帧内预测以及重建亮度信号的计算;(2)白色背景流程框表示信号操作在非映射域(即原始信号空间),包括所有其他的环内滤波操作、运动补偿,色度帧内预测,色度重建信号计算以及解码图像存储等;(3)黄色背景流程框表示LMCS操作,包括亮度信号的的映射和反映射、基于亮度信号的色度信号尺度变换。
1.1 基于分段线性模型的亮度映射
亮度的环内映射是通过对整个动态范围的码字重新分配来实现动态范围的矫正,以提高压缩效率。亮度映射为可逆过程,包括前向映射 FwdMap 和逆映射 InvMap 。正映射函数 FwdMap通过16段的分段线性函数进行传输,逆映射InvMap可通过正映射函数推导得到。
亮度映射(luma mapping, LM)相关参数记录在码流的tile group中,首先以一个标志位表示是否采用LM技术,如果采用相应的分段线性模型参数紧跟着传输。分段线性模型将输入信号的动态范围划分为等宽度的16段,每段的线性映射参数由所分配到该段的码字进行表示。以10bit深度输入信号为例,16段每段可分得 1024 / 16 = 64 1024/16 = 64 1024/16=64个码字。传输码字的长度将用以计算尺度伸缩因子,以及映射函数本身的校正。
对于分段线性映射模型的每一段 i , i ∈ 0 , 1 , 2...15 i,i∈{0,1,2...15} i,i∈0,1,2...15的映射函数,由InputPivot[]和MappedPivot[]计算得到,具体计算方式如下(以10bit输入数据为例):
- OrgCW = 64
- For i = 0 : 16 , I n p u t P i v o t [ i ] = i ∗ O r g C W i = 0:16, InputPivot[ i ] = i * OrgCW i=0:16,InputPivot[i]=i∗OrgCW
- For
i
=
0
:
16
,
M
a
p
p
e
d
P
i
v
o
t
[
0
]
=
0
i = 0:16,MappedPivot[ 0 ] = 0
i=0:16,MappedPivot[0]=0
for( i = 0; i <16 ; i++) MappedPivot[ i + 1 ] = MappedPivot[ i ] + SignalledCW[ i ];
以亮度映射模型解释上述LMCS框图:
- 帧间预测的运动补偿时在原始像素域进行,但是信号重建在映射域进行,也就是说,经过参考帧运动补偿后的信号 Y p r e d Y_{pred} Ypred,需要经过亮度映射将预测信号从原始像素域映射到映射域,以完成重建像素计算,即需要进行如下变换 Y p r e d ′ = F w d M a p ( Y p r e d ) Y'_{pred} = FwdMap(Y_{pred}) Ypred′=FwdMap(Ypred)。
- 帧内预测不要再进行信号映射,因为帧内预测在映射域进行
- 当得到重建信号 Y r Y_r Yr后,逆映射函数将重建亮度信号从映射域变换到原始像素域 Y p r e d ′ = I n v M a p ( Y r ) Y'_{pred} = InvMap(Y_{r}) Ypred′=InvMap(Yr)。
1.2 色度残差的亮度依赖性尺度变换
色度残差尺度变换(Luma-dependent chroma residual scaling, LDCS)依据亮度信号和色度信号的相关性,对色度残差进行补偿。LDCS同样在tile level进行表示是否采用该技术。需要注意,如果当前块使用了亮度映射,且dual tree parittion 关闭,则需要额外的标志标明是否使用色度残差尺度伸缩。如果当前快没有使用亮度映射,或者dual tree parittion打开(即亮度、色度单独划分预测),色度残差尺度伸缩默认关闭。
LDCS依赖于对应亮度预测信号的均值。用 a v g Y ′ avgY' avgY′表示亮度预测信号均值,则 C S c a l e I n v C_{ScaleInv} CScaleInv的计算步骤如下:
- 利用亮度映射的InvMap函数,找出 a v g Y ′ avgY' avgY′所对应分段线性模型的段序号 Y I d x Y_{Idx} YIdx。
- C S c a l e I n v = c S c a l e I n v [ Y I d x ] C_{ScaleInv} = cScaleInv[Y_{Idx}] CScaleInv=cScaleInv[YIdx],其中 c S c a l e I n v [ ] cScaleInv[] cScaleInv[]为预定义好的16段 look-up table。
如果当前块采用帧内、CIIP或者IBC模式编码, a v g Y ′ avgY' avgY′直接对预测信号求平均得到。如果当前快采用帧间预测模式,需要对预测信号进行亮度映射,在映射域求平均。不同于亮度映射逐像素计算, LDCS中 C S c a l e I n v C_{ScaleInv} CScaleInv对整个色度块为一个定值,LDCS通过 C S c a l e I n v C_{ScaleInv} CScaleInv的计算方式如下:
- 编码端: C R e s S c a l e = C R e s × C S c a l e = C R e s / C S c a l e I n v C_{ResScale} = C_{Res} \times C_{Scale} = C_{Res}/C_{ScaleInv} CResScale=CRes×CScale=CRes/CScaleInv
- 解码端: C R e s = C R e s S c a l e / C S c a l e = C R e s S c a l e × C S c a l e I n v C_{Res} = C_{ResScale} / C_{Scale} = C_{ResScale}\times C_{ScaleInv} CRes=CResScale/CScale=CResScale×CScaleInv
1.3 编码端LMCS参数预测
VTM使用了对SDR和HDR序列的不同的参数预测方式。对SDR,参数预测基于局部亮度方差,并针对PSNR进行优化。对经过PQ的HDR信号,参数预测基于亮度值且这对wPSNR进行优化。