H.266环路滤波之LMCS亮度映射和色度缩放

1.背景介绍

在H.266里新增了一个Luma Mapping with Chroma Scaling, LMCS工具,对编码前的视频图像进行预处理。正如它的名字一样,它包括两个部分内容,分别是基于自适应分段线性模型亮度映射LM和基于亮度的色度残差缩放CS。(其实LMCS原名叫in-loop reshaper)图片

其中亮度映射应用于像素级,通过充分利用亮度值范围及光电转换特性OETF来提高视频的编码效率。而色度缩放应用于色度块级,补偿亮度信号映射对色度信号的影响,是LM的补充。

LMCS最初是用来给HEVC的HDR/WCG视频提高客观编码性能的,它主要用在HDR视频上,后来H.266里又把它拿过来,既可以用在SDR视频上,也可以用在HDR视频上。

要讨论LMCS的技术细节,需要使用和它相关的原始域映射域两个概念。当视频信号亮度值经过LM的处理则属于映射域,此外属于原始域。解码端的LMCS框架结构如下图所示:图片

这个图的上半部分是色度缩放处理,下半部分是亮度映射处理。其中浅蓝色背景框图里的是映射域,它包括反量化,反变换,亮度帧内预测,亮度重建等。这些处理过程是传统视频编码框架已有的,除此之外,LMCS还新引入了像上图黄色框图这样的新的处理过程。

而上图中没有背景颜色的框图是原始域,这些处理有环路滤波(DBK,SAO,ALF),运动补偿,色度帧内预测,色度重建以及保存重建图像等。

2.技术细节

LMCS的关键在于确定和视频源的特性直接相关的亮度映射函数和色度缩放因子

亮度映射的基本思想是在确定的位深下更好地使用所允许的亮度值范围,即动态范围。其实就是将原始域亮度值范围映射到更大的允许亮度值范围。

色度缩放的基本思想是补偿亮度映射后对色度信号的影响。在H.266中,色度分量的量化参数QP取决于相应的亮度分量,LM可能会引起亮度值的变化,进而导致色度分量的QP也被影响。而色度缩放通过调整色度块内的色度残差来平衡这一影响。

2020年的《Luma Mapping with Chroma Scaling in Versatile Video Coding》论文里有对H.266的LMCS技术工具的很详细介绍,大家可以自行阅读和学习。

注意的是,论文这里i取值不能取到16。图片

vvenc里EncReshape的preAnalyzerLMCS函数会进行LMCS的预处理。

3.举个例子

如果大家去阅读有关LMCS的论文,基本都会提到关于HDR视频的ITU-R标准文档BT.2100或BT.2020,并以它里面所规定的10bit视频亮度取值范围做为LMCS技术的出发点进行阐述。

实际所指的大概就是下图的TABLE9内容。

图片

对于10bit视频,它这里规定了2种不同的data range。其中Narrow range的亮度像素取值范围仅仅是64~940。但在视频编码(非Full range)时,又想要利用10bit视频能允许的0~1023这样一个比较大亮度取值范围,所以就提出用LM把64~940范围放大到0~1023

说白了就是将一个区间映射到另一个区间,而区间映射的模型一般如下:

图片

H.266里LM的公式基本形式和它一致,如下:图片

这里OrgCW等于(2的BitDepth次方除以16),InputPivot表示原始域内各个亮度像素值子区间的分界点,MappedPivot表示的是映射域各个子区间的分界点。Ypred是原始域内10bit位深的一个亮度值。子区间是什么请看下文。

下面以SDR视频为例,介绍一下在VTM编码器里面如何来预估LM的编码参数。

第1步:分析视频内容,在原始域划分子区间,分配初始码字。

VTM里的LMCS技术仅针对10bit进行。如果一个要进行LMCS处理的视频不是10bit,它会先将其转为10bit。

然后把10bit所能允许的范围0~1023平均分成16个子区间并编号为0~15,每个子区间是64个允许像素值。

接着判断每个子区间的有效性,比如Narrow range的10bit原视频,子区间0和15就是无效的区间,因为原视频亮度像素值取不到。

图片

之后给有效的子区间分配相同的码字binCw。

图片

第2步:根据图像内容调整每个子区间的码字。

根据帧内容统计信息进行每个小区间码字的调整。在VTM里是根据像素亮度分量的局部方差值pxlVar来做调整。以当前像素位置为中心的正方形区域计算局部方差值。

图片

winSize和图片分辨率大小有关,winSize计算如下:

图片

在像素方差基础上再计算每个子区间像素方差log对数的平均值。

图片

这里的binCnt[i]是每个子区间允许的亮度像素值个数,10bit视频就是64。

计算所有子区间的方差对数平均值并归一化:

图片

然后给局部空域方差较小的小区间分配较多的码字,反之亦然。具体地,

如果normVar[i]<1.0则

图片

如果normVar[i]大于1.0

图片

其中

图片

其中hist[i]是子区间i里的像素个数占所有像素个数的百分比。

第3步:限制和修正码字大小。

经过以上一系列的微操以后,如果分配给每个子区间的码字总和超过了允许的最大码字,就从第一个子区间开始,每个子区间减少相同数量的码字,直至分配码字之和等于编码所允许的最大码字。最终确定给每个子区间分配的码字数量SignalledCW[i]

第4步:确定LMCS相关的其他参数,包括色度调整自适应参数。

对于色度缩放,它是以TU为单位,即同一个TU里的像素缩放因子是一样的。色度缩放和亮度映射一样,也是采用分段线性模型,且分段数也和亮度映射一样,同一个分段里面的缩放因子也是相同的。色度缩放因子计算如下:图片

除了deltaCRS色度缩放偏移量(LMCS_APS)之外,其他变量都和亮度映射所用的是一样的。

4.语法元素

LMCS相关的语法元素涉及SPS层,PH层,SH层和APS层,这前三个里面多是flag语法,而在APS里面是具体的LMCS信息,如下图的7.3.2.19节内容。图片图片

这些语法元素是由标准规定的,所以编码器侧需要把这些语法元素值写到码流里面。语法lmcs_min_bin_idx其实就是上文的有效子区间的起始索引,lmcs_delta_max_bin_idx等于15减去有效子区间的最大索引,对于8bit的SDR视频源来说,有效子区间索引是1~14,所以这两个语法元素值都会是1。

每个有效子区间会有一个lmcs_delta_abs_cw语法元素写进码流,这个其实就是映射域每个子区间分配的码字个数和OrgCW的差值。

大家可以用我之前发的这个浏览器版本工具来查看H.266裸码流里面关于LMCS的语法元素和值,如下图:

https://codec2021.github.io/bsparser/

H.266环路滤波之LMCS亮度映射和色度缩放

5.小结

前面说了这么多,不知我是否说明白了。如果大家在看完后还是不清楚H.266的LMCS究竟是怎么实现的,没关系,抓住这样几点:

1.LM主要对10bit的视频进行,也就是HDR视频,它把64~940取值范围的像素亮度值映射到0~1023得到新值。

2.LM映射函数采用分段线性模型,分段是它会把原始域的0~1023等分成16个子区间,而每个子区间内的亮度值区间映射是线性模型,而且是常见的区间映射线性模型。

3.编码器侧先依次确定出每个映射域子区间的码字个数,也就知道了每个子区间的边界点,从而再根据区间映射线性模型把原始域里的像素进行映射。图片
4.标准只规定了支持的有效子区间个数,及每个有效子区间需要编码delta的code word语法元素,至于说要给每个有效子区间分配多少个码字,由编码器自行决策。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论