【HEVC简介】ALF-Adative Loop Filter
自适应环路滤波器f 是根据原始信号和失真信号计算得到均方意义下的最优滤波器,即维纳滤波器,如公式(2-1)所示,
其中,Y是失真信号,X是原始信号,是滤波后估计得信号,f是自适应滤波器系数向量,使得滤波信号和原始信号X之间均方误差(MSE)最小,如图1所示。
图1:ALF滤波器
本提案提出的ALF在视频编码框架中的位置如下图所示,即对SAO滤波后的重建图像进行恢复,使得重建图像与原始图像的MSE最小。
图2:ALF在AVS2中的位置
2、滤波器形状和系数决策
本提案对彩色图像的亮度和色度通道均采用如图3所示的7x7十字加3x3方形的中心对称滤波器,每个滤波器只包含9个不同的系数,其中C0~C7是7bit有符号数,取值范围是[-1,1),C8是7bit无符号数,取值范围是[0,2)(注:C0~C8的范围后面提案中被修改)。
图3:ALF滤波器形状
对于个区域,按照LCU对齐的原则均匀划分为16个区域(图像右边界和下边界除外),对每个区域分别计算其对应的ALF系数。对训练得到的ALF系数(这个过程就是维纳滤波器的原理),依次计算相邻区域(按照类Hilbert扫描序号上相邻的区域,如图4所示)合并后得到的率失真代价,选择率失真代价最小的区域进行合并,该过程迭代直到合并为一套滤波器为止,从中选择率失真代价最小的合并结果,合并的区域共用相同的滤波系数。对于色度分量(Cb和Cr)分别设计一套滤波系数。对每个分量提供滤波器控制开关,根据率失真代价决定当前图像分量是否进行滤波。为了更细粒度的控制滤波过程,我们对每个LCU的三个颜色分量分别建立控制开关,用1个比特标识,如果当前LCU滤波后的率失真性能优于滤波前,则标识为1,表示对该LCU进行滤波。
图4:类Hilbert扫描方式
为了降低编码ALF参数带来的码率增加,我们提出在编解码端建立ALF参数缓存,缓存最大可以支持8组ALF参数(后面提案改成1组)。在编码端,分别计算当前训练的ALF参数和缓存中ALF参数率失真代价,选择率失真代价最小的作为当前图像的自适应滤波器参数,如果缓存中ALF参数率失真代价小,那么只需传递缓存中滤波器的索引值即可。
3、低延迟模式(LL)和高效模式(HE)
考虑到利用当前编码帧训练ALF参数会造成编码延迟,因此,本提案提出利用相邻已经编码重构的图像进行ALF参数训练,从而降低编码延迟,我们称这种模式为低延迟模式(LL),而将利用当前编码重构图像训练ALF参数的方式成为高效模式(HE)如图5所示。
图5:(a)低延迟ALF参数训练和(b)高效ALF参数训练
本部分对提出的LL和HE两种配置的ALF滤波器分别进行验证。Anchor是RD6.0,配置是通测条件[1],两种配置的测试结果分别如表1和2所示。
表1:所提方案在LL配置下与RD6.0 anchor的性能比较
表2:所提方案在HE配置下与RD6.0 anchor的性能比较
5、结论
本提案为AVS2设计了自适应环路滤波器,在HE和LL配置下均获得了较高的编码性能增益,编码复杂度的提升在可接受范围内。所以被AVS工作组采纳,并集成到参考软件RD7.0中,其中LL和HE都集成实现,并通过代码中的开关进行选择。
二、ALF语法格式说明:
1、序列头定义
序列头定义 |
描述符 |
sequence_header() { |
|
video_sequence_start_code |
f(32) |
profile_id |
u(8) |
level_id |
u(8) |
…… other syntax | |
sample_adaptive_offset_enable |
u(1) |
adaptive_loop_filter_enable |
u(1) |
pmvr_enable |
u(1) |
reserved_bits |
r(3) |
next_start_code() |
|
} |
|
I图像头定义 |
描述符 |
i_picture_header() { |
|
……other syntax
|
|
loop_filter_disable |
u(1) |
if ( ! loop_filter_disable) { |
|
loop_filter_parameter_flag |
u(1) |
if ( loop_filter_parameter_flag) { |
|
alpha_c_offset |
se(v) |
beta_offset |
se(v) |
} |
|
} |
|
if (AlfEnableFlag) { |
|
for ( i=0; i<3; i++ ) { |
|
pic_alf_enable[i] |
u(1) |
} |
|
if(PicAlfEnableFlag[0]|| PicAlfEnableFlag[1]|| PicAlfEnableFlag[2]) |
|
{ |
|
alf_parameter_set_new_flag |
u(1) |
alf_parameter_set_id (这两个参数在后面提案中有修改) |
u(3) |
}
|
|
if(alf_parameter_set_new_flag) |
|
{ |
|
alf_parameter_set() |
|
} |
|
} |
|
next_start_code() |
|
} |
|
PBF图像头定义 |
描述符 |
pbf_picture_header() {
|
|
……other syntax
|
|
loop_filter_disable |
u(1) |
if ( ! loop_filter_disable) { |
|
loop_filter_parameter_flag |
u(1) |
if ( loop_filter_parameter_flag) { |
|
alpha_c_offset |
se(v) |
beta_offset |
se(v) |
} |
|
} |
|
if (AlfEnableFlag) { |
|
for ( i=0; i<3; i++ ) { |
|
pic_alf_enable[i] |
u(1) |
} |
|
if(PicAlfEnableFlag [0]|| PicAlfEnableFlag [1]|| PicAlfEnableFlag [2]) |
|
{ |
|
alf_parameter_set_new_flag |
u(1) |
alf_parameter_set_id |
u(3) |
} |
|
if(alf_parameter_set_new_flag) |
|
{ |
|
alf_parameter_set() |
|
} |
|
next_start_code() |
|
} |
|
条带定义 |
描述符 |
slice() { |
|
……other syntax
|
|
while ( ! byte_aligned() ) |
|
aec_byte_alignment_bit |
f(1) |
do { |
|
for ( i=0; i<3; i++ ) { |
|
if(PicAlfEnableFlag [i]) |
|
lcu_alf_enable[i][LcuIndex] |
u(1) |
} |
|
coding_unit_tree(LcuSizeInBit, LcuIndex) |
|
aec_lcu_stuffing_bit |
ae(v) |
} while ( ! is_end_of_slice() ) |
|
next_start_code() |
|
} |
|
5、自适应环路滤波参数
自适应环路滤波参数定义 |
描述符 |
alf_parameter_set () { |
|
if(PicAlfEnableFlag [0]){ |
|
alf_no_filters_minus1 |
u(4) |
for(i=0;i<alf_no_filters_minus1+1;i++){ |
|
if(i>0) |
|
alf_region_distance[i] |
u(4) |
for(j=0;j<9;j++) |
|
alf_coeff_luma[i][j] |
ae(v) |
} |
|
} |
|
if(PicAlfEnableFlag [1]){ |
|
for(j=0;j<9;j++) |
|
alf_coeff_chroma[0][j] |
ae(v) |
} |
|
if(PicAlfEnableFlag [2]){ |
|
for(j=0;j<9;j++) |
|
alf_coeff_chroma[1][j] |
ae(v) |
} |
|
} |
|
6、语义说明
自适应滤波允许标志 adaptive_loop_filter_enable。值为‘1’表示可使用自适应滤波;值为‘0’表示不应使用自适应滤波。AlfEnableFlag的值等于adaptive_loop_filter_enable的值。
图像自适应滤波允许标志 pic_alf_enable[i]。PicAlfEnableFlag的值等于pic_alf_enable的值。PicAlfEnableFlag [i]的值为1表示在该图像内第i个分量可使用自适应滤波;值为0则表示在该图像内第i个分量不应使用自适应滤波。其中i等于0表示亮度分量,i等于1表示Cb分量,i等于2表示Cr分量。
自适应滤波参数集标号 alf_paramter_set_id。3位无符号整数,表示当前图像自适应滤波参数集的标号。
自适应环路滤波参数集解码标志 alf_parameter_set_new_flag。值为‘1’表示当前图像存在aps解码过程;值为‘0’表示当前图像不存在aps解码过程。
LCU自适应滤波允许标志 lcu_alf_enable[i][LcuIndex]。lcu_alf_enable[i] [LcuIndex]值为1表示第LcuIndex个LCU的第i个颜色分量可使用自适应滤波;值为0则表示第LcuIndex个LCU的第i个颜色分量不使用自适应滤波。其中i等于0表示亮度分量,i等于1表示Cb分量,i等于2表示Cr分量。
图像亮度分量自适应滤波个数 alf_no_filters_minus1。alf_no_filters_minus1加1表示当前图像亮度分量自适应滤波器个数。
图像亮度分量相邻自适应滤波器间区域个数 alf_region_distance。alf_region_distance[i]表示亮度分量第i个自适应滤波器与第i-1个自适应滤波器之间区域标号的差值。
图像亮度分量自适应滤波系数alf_coeff_luma。alf_coeff_luma[i][j] 表示亮度分量第i个自适应滤波器的第j个系数。
图像分量自适应滤波系数 alf_coeff_chroma。alf_coeff_chroma[0][j] 表示Cb分量第j个自适应滤波器系数,alf_coeff_chroma[1][j] 表示Cr分量第j个自适应滤波器系数。
三、解码过程:
sequence_header中ALF语法元素adaptive_loop_filter
如果adaptive_loop_filter_enable为0,则SAO的输出样本直接作为ALF的输出样本。
如果adaptive_loop_filter_enable为1,则根据6.2中定义的过程对SAO输出样本进行自适应环路滤波处理
Picture header中ALF语法元素解码
解码pic_alf_enable[3]语法元素,其中pic_alf_enable[0]表示亮度分量是否进行ALF滤波处理,如果pic_alf_enble[0]为1表示亮度分量进行ALF处理,否则亮度分量不进行ALF处理。pic_alf_enable[1]和pic_alf_enable[2]分别表示色度分量Cb和Cr是否进行ALF处理。将pic_alf_enable[i]的值分别赋给PicAlfEnableFlag。
滤波器参数标识解码
如果PicAlfEnableFlag[0]~[3]不同时为0,即存在需要进行滤波处理的图像分量。那么依次解码alf_parameter_set_new_flag和alf_parameter_set_id。
如果alf_parameter_set_new_flag为1,则将6.2.3中解码得到的滤波器系数保存到alf_parameter_set_id所指示的缓存区中。
如果alf_parameter_set_new_flag为0,则跳过6.2.3解码过程,从alf_parameter_set_id所指示的缓存区中读取ALF滤波器系数。
滤波器系数解码
如果PicAlfEnableFlag[0]为1,则解码alf_no_filters_minus1语法元素,alf_no_filters_minus1+1 表示亮度分量滤波器个数。
解码每组滤波器系数控制的相邻基本区域的数量或者相邻滤波器系数控制区域的距离alf_region_distance[i](i>0)(如果将16个划分区域记做基本区域单元,那么这里的滤波器系数控制区域的距离可以表示为两个区域中的基本单元个数)。例如alf_region_distance[1]=2 表示第0组滤波器系数和第1组滤波器系数之间的距离2个基本单元,也就是第0组滤波器控制2个基本区域单元。如果存在4组滤波器,其中alf_region_distance[1]=4,alf_region_distance[2]=5,alf_region_distance[3]=2,其中第0组控制0-3的基本区域,第1组控制4-8的基本区域,第2组控制9-10的基本区域,第3组控制11-15的基本区域。
解码亮度分量滤波器系数alf_coeffluma[i][j]表示亮度分量中第i组滤波器的第j个系数。
如果PicAlfEnableFlag[1]为1,则解码色度Cb分量对应的滤波器系数,其中alf_coeff_chroma[0][j]表示Cb分量滤波器系数的第j个系数。否则跳过色度Cb分量滤波器系数解码。
如果PicAlfEnableFlag[2]为1,则解码色度Cr分量对应的滤波器系数,其中alf_coeff_chroma[0][j]表示Cb分量滤波器系数的第j个系数。否则跳过色度Cb分量滤波器系数解码。
系数重构
亮度分量和色度分量的最后一个系数,即如图6所示的C8,alf_coeffluma[i][AlfCodedLengthLuma-1]和alf_coeff_chroma[g][AlfCodedLengthChroma-1]的重构值通过如下过程得到(以亮度为例),
#define ALF_NUM_BIT_SHIFT 6(对于这个6的处理,后面提案对C0-C7和C8有了重新的修改)
sum = 0;
for(j=0; j< AlfCodedLengthLuma -1; j++)
{
sum += (2 * alf_coeffluma[i][j]);
}
coeffPred = (1<<ALF_NUM_BIT_SHIFT) - sum;
alf_coeffluma[i][AlfCodedLengthLuma-1]=coeffPred+ alf_coeffluma[i][AlfCodedLengthLuma-1][ AlfCodedLengthLuma-1];
图6 滤波器形状和系数标号
LCU控制语法元素
如果PicAlfEnableFlag[i]为1,那么在读取每个LCU参数前首先读取其滤波器控制开关参数lcu_alf_enable[i],该变量为1表示对当前LCU进行6.2.6所指定的自适应环路滤波处理,否则跳过自适应环路滤波。
LCU滤波过程
如果LcuIndex所指示的LCU的滤波器控制开关lcu_alf_enable[i][LcuIndex]为1,那么对该LCU中第i个颜色分量进行滤波。对LCU中的每个样本进行滤波时,当且仅当滤波器所使用的样本都可用时才对该样本进行滤波,其中样本可用是指该样本存在且与当前滤波样本处于相同的slice内。
对亮度分量中样本p(m,n)利用第i组滤波器进行滤波的计算过程如下:
p_tmp = alf_coeffluma[i][0]*(p(m-3,n) + p(m+3,n))
p_tmp = p_tmp + alf_coeffluma[i][1]*(p(m-2,n) + p(m+2,n))
p_tmp = p_tmp + alf_coeffluma[i][2]*(p(m-1,n-1) + p(m+1,n+1))
p_tmp = p_tmp + alf_coeffluma[i][3]*(p(m-1,n) + p(m+1,n))
p_tmp = p_tmp + alf_coeffluma[i][4]*(p(m-1,n+1) + p(m+1,n-1))
p_tmp = p_tmp + alf_coeffluma[i][5]*(p(m,n-3) + p(m,n+3))
p_tmp = p_tmp + alf_coeffluma[i][6]*(p(m,n-2) + p(m,n+2))
p_tmp = p_tmp + alf_coeffluma[i][7]*(p(m,n-1) + p(m,n+1))
p_tmp = p_tmp + alf_coeffluma[i][8]*(p(m,n))
p_tmp = (p_tmp + alf_coeffluma[i][8])>>ALF_NUM_BIT_SHIFT
p(m,n) = max(0,min(p_tmp,255))
图7 滤波样本
滤波器参数缓存(关于缓存滤波器系数的个数,后面提案进行了修改)
滤波器缓存中包含的参数包括滤波器帧级控制开关pic_alf_enable[3],滤波器系数alf_coeffluma[alf_no_filters_minus1+1][AlfCodedLengthLuma]和alf_coeffChroma[2][AlfCodedLengthChroma]和滤波器控制区域参数alf_region_distance。
四、后续提案修改:
1、ALF时域系数缓存核心实验提案:M3384
本提案对M3292提出的环路滤波器技术在RD7.0上进行了时域滤波器系数缓存的实验。原提案中支持8套时域滤波器系数缓存,本提案测试了关闭时域缓存和只保留一个时域缓存的滤波器性能。实验表明,关掉时域缓存时,相对于原有ALF技术AI、RA和LDP通测条件下分别有0.09%、0.17%和0.17%的性能损失;只保留一个时域缓存时,AI、RA和LDP通测条件下分别有0.00%、0.12%和0.09%的性能损失。为了保持滤波器灵活性,建议现有ALF中保留一个时域滤波器系数缓存。
2、基于虚拟边界的自适应环路滤波:M3433(存在提案针对该提案进行的改进)
图 8: AVS2中基于LCU解码过程中需要的line buffer示意图
为了减少ALF技术产生的line buffer的增加,本提案提出采用虚拟边界技术,如果ALF滤波没有使用跨虚拟边界的像素时,那么滤波过程不变;如果ALF用到了跨虚拟边界的像素,那么需要将滤波器用到的跨虚拟边界像素对应的系数及其水平对称位置的系数作相对应的修改,使得滤波器不再使用对应的跨虚拟边界的像素及其水平对称位置的像素,从而避免了增加line buffer,如图2所示,虚线是LCU的虚拟边界。AVS2亮度分量中,deblocking filter需要3行line buffer,SAO需要1行line buffer,因此虚拟边界距离LCU亮度下边界4行像素;AVS2色度分量中,deblocking filter需要2行line buffer, SAO需要1行line buffer,因此虚拟边界距离LCU色度下边界3行像素。
图9:滤波器形状跨越虚拟边界时具有虚拟边界的ALF滤波过程(亮度)
本提案提出采用虚拟边界对LCU内部进行ALF处理的像素进行限定,从而避免了M3292中ALF产生的line buffer。
3、样本滤波补偿参数:M3466(这个修改在其他提案中,该提案是修改标准文档中相关说明)
图像亮度分量样本滤波补偿滤波器系数 alf_coeff_luma[i][j]
alf_coeff_luma[i][j]表示亮度分量第i个样本滤波补偿滤波器的第j个系数。当j大于或等于0且小于或等于7时,AlfCoeffLuma[i][j]的值等于alf_coeff_luma[i][j]的值。其中,时,alf_coeff_luma[i][j]为;。(权值取整数,避免浮点运算)
图像色度分量样本滤波补偿滤波器系数 alf_coeff_chroma[0][j]和alf_coeff_chroma[1][j]
alf_coeff_chroma[0][j]表示Cb分量第j个样本滤波补偿滤波器的系数,alf_coeff_chroma[1][j] 表示Cr分量第j个样本滤波补偿滤波器的系数。当j大于或等于0且小于或等于7时,AlfCoeffChma[0][j]的值等于alf_coeff_chroma[0][j]的值,AlfCoeffChma[1][j]的值等于alf_coeff_chroma[1][j]的值。其中,j大于或等于0且小于或等于7时,alf_coeff_chroma[i][j]为7位有符号数,取值范围是-64~63;alf_coeff_chroma[i][8]为12位有无符号数,取值范围是-1088~107。解码过程对应更改。
4、基于虚拟边界的自适应环路滤波:M3493(是对M3433的改进)
图10:滤波器形状跨越虚拟边界时具有虚拟边界的ALF滤波过程(亮度)
如上图10,该提案的修改主要就是对于虚拟边界情况时,对于C0'、C1'等值不再是简单地置0,而是赋值为其他没有越过虚拟边界的像素点的值。
【HEVC简介】ALF-Adative Loop Filter的更多相关文章
- FFmpeg的HEVC解码器源代码简单分析:环路滤波(Loop Filter)
===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...
- 【HEVC简介】SAO-Sample Adaptive Offset, 样本自适应偏移量
paper: Sample Adaptive Offset for HEVC <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见:http://www.cnblogs.com/ ...
- FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- 【HEVC简介】DB-DeBlock Filter
参考论文:HEVC Deblocking Filter <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见:http://www.cnblogs.com/DwyaneTalk/ ...
- Django框架简介及模板Template,filter
Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...
- Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)
Bloom Filter的中文翻译叫做布隆过滤器,是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询 ...
- 【HEVC简介】Inter Prediction Tools
参考文献:见<High Efficiency Video Coding (HEVC)>Inter-Picture Prediction in HEVC章节 <HEVC标准介绍.HEV ...
- 【HEVC简介】High Level Syntax
参考文献:见<High Efficiency Video Coding (HEVC)>High Level Syntax章节 <HEVC标准介绍.HEVC帧间预测论文笔记>系列 ...
- 【HEVC简介】CTU、CU、PU、TU结构
参考文献:见<High Efficiency Video Coding (HEVC)>Block Structures and Parallelism Features in HEVC章 ...
随机推荐
- NSDictionary字典创建,获取,遍历,可变字典的删除 - iOS
字典是以键值对的形式来存储数据 key value 1 NSDictionary 字典 1.1 创建字典,不可变的 NSDictionary * dic = [NSDictionary diction ...
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
使用WebClient读取XAP包同目录下的XML文件 我们想要读取XAP包下面的XML文件,需要将此XML文件放在加载XAP包的网页的目录中去,然后使用URI方式读取此URL方式下的XML文件. 首 ...
- 书写优雅的shell脚本(五)- shell中(())双括号运算符
在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构 ...
- BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组
BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description 给定N个数对(xi, yi),求最长上升子 ...
- 「LuoguP1238」 走迷宫
Description 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描 ...
- 【HDU 4722】 Good Numbers
[题目链接] 点击打开链接 [算法] f[i][j]表示第i位,数位和对10取模余j的数的个数 状态转移,计算答案都比较简单,笔者不再赘述 [代码] #include<bits/stdc++.h ...
- 洛谷P3354 [IOI2005]Riv 河流——“承诺”DP
题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个“承诺”,只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. 代码如下: #inc ...
- emacs配置文件的基础知识 (转载)
转自:http://blog.csdn.net/schumyxp/article/details/2278268 emacs的配置文件,叫作.emacs,是个隐藏文件,存在于当前用户的根目录下面,也就 ...
- JS中的回调函数实例浅析
本文实例讲述了JS中的回调函数.分享给大家供大家参考,具体如下: 在说回调函数之前,不妨先看一段代码,相信有点js基础的同学都能明白他的含义: ? 1 2 3 document.getElementB ...
- Android—— ListView 的简单用法及定制ListView界面
一.ListView的简单用法 2. 训练目标 1) 掌握 ListView 控件的使用 2) 掌握 Adapter 桥梁的作用 实现步骤: 1)首先新建一个项目, 并让ADT 自动帮我们创建好活动. ...