VVC环路滤波(一):ALF
在VTM5中提供了三种环路滤波技术:去方块滤波(Deblocking filter,DF),样点自适应补偿(Sample adaptive offset,SAO)和自适应环路滤波(adaptive loop fitler,ALF)。在VTM5中这些滤波工具的使用顺序为DF,SAO,ALF。
VTM5中的DF和SAO与HEVC中的类似,ALF是VTM5中新增的技术。本文主要介绍ALF。
ALF
自适应环路滤波(adaptive loop fitler,ALF)是VTM5中新增的技术。是基于块的滤波技术,它作用于4x4的子块,对于每个4x4的子块需要将其归为25个类别之一,然后根据类别为其选择滤波器。
1、滤波器形状
VTM5提供了两种菱形滤波器,如上图所示。左边5x5的菱形滤波器用于色度分量,右边7x7的菱形滤波器用于亮度分量。
enum AlfFilterType
{ALF_FILTER_5,ALF_FILTER_7,ALF_NUM_OF_FILTER_TYPES
};
2、块分类
对于亮度分量需要为每个4x4的子块分类,共25个类别。类别C由块的方向D和活动性A决定:
C = 5D + A
为了计算D和A,需要计算子块的水平、垂直、两个对角线方向的梯度,梯度计算使用1维拉普拉斯方法实现:
为了减少计算复杂度在计算梯度前进行下采样,如下图:
得到梯度后D和A的计算方法如下:
对于色度分量不需要对其子块进行分类操作,它只有一个滤波器。
3、滤波器系数和门限值几何变换
由上一步可以得到滤波器,但是在滤波操作前需要对滤波器系数和相应门限值进行几何变换,包括旋转、对角和垂直翻转。变换类型由上面计算的块的梯度决定。对滤波器进行几何变换效果等价于对滤波区域进行相应几何变换,这么做的目的是使不同块方向对齐。
if( filtType == ALF_FILTER_7 ){if( transposeIdx == 1 ){//!<对角线变换filterCoeff = { coef[9], coef[4], coef[10], coef[8], coef[1], coef[5], coef[11], coef[7], coef[3], coef[0], coef[2], coef[6], coef[12] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[9], clip[4], clip[10], clip[8], clip[1], clip[5], clip[11], clip[7], clip[3], clip[0], clip[2], clip[6], clip[12] };
#endif}else if( transposeIdx == 2 ){//!<垂直翻转filterCoeff = { coef[0], coef[3], coef[2], coef[1], coef[8], coef[7], coef[6], coef[5], coef[4], coef[9], coef[10], coef[11], coef[12] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[0], clip[3], clip[2], clip[1], clip[8], clip[7], clip[6], clip[5], clip[4], clip[9], clip[10], clip[11], clip[12] };
#endif}else if( transposeIdx == 3 ){//!<旋转变换filterCoeff = { coef[9], coef[8], coef[10], coef[4], coef[3], coef[7], coef[11], coef[5], coef[1], coef[0], coef[2], coef[6], coef[12] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[9], clip[8], clip[10], clip[4], clip[3], clip[7], clip[11], clip[5], clip[1], clip[0], clip[2], clip[6], clip[12] };
#endif}else{//!<不变换filterCoeff = { coef[0], coef[1], coef[2], coef[3], coef[4], coef[5], coef[6], coef[7], coef[8], coef[9], coef[10], coef[11], coef[12] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[0], clip[1], clip[2], clip[3], clip[4], clip[5], clip[6], clip[7], clip[8], clip[9], clip[10], clip[11], clip[12] };
#endif}}else{if( transposeIdx == 1 ){//!<对角线变换filterCoeff = { coef[4], coef[1], coef[5], coef[3], coef[0], coef[2], coef[6] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[4], clip[1], clip[5], clip[3], clip[0], clip[2], clip[6] };
#endif}else if( transposeIdx == 2 ){//!<垂直翻转filterCoeff = { coef[0], coef[3], coef[2], coef[1], coef[4], coef[5], coef[6] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[0], clip[3], clip[2], clip[1], clip[4], clip[5], clip[6] };
#endif}else if( transposeIdx == 3 ){//!<旋转变换filterCoeff = { coef[4], coef[3], coef[5], coef[1], coef[0], coef[2], coef[6] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[4], clip[3], clip[5], clip[1], clip[0], clip[2], clip[6] };
#endif}else{//!<不变换filterCoeff = { coef[0], coef[1], coef[2], coef[3], coef[4], coef[5], coef[6] };
#if JVET_N0242_NON_LINEAR_ALFfilterClipp = { clip[0], clip[1], clip[2], clip[3], clip[4], clip[5], clip[6] };
#endif}
采用的几何变换方式由上面计算的四个方向的梯度决定:
int hv1, hv0, d1, d0, hvd1, hvd0;
if( sumV > sumH ){hv1 = sumV;hv0 = sumH;dirTempHV = 1;}else{hv1 = sumH;hv0 = sumV;dirTempHV = 3;}if( sumD0 > sumD1 ){d1 = sumD0;d0 = sumD1;dirTempD = 0;}else{d1 = sumD1;d0 = sumD0;dirTempD = 2;}if( d1*hv0 > hv1*d0 ){hvd1 = d1;hvd0 = d0;mainDirection = dirTempD;secondaryDirection = dirTempHV;}else{hvd1 = hv1;hvd0 = hv0;mainDirection = dirTempHV;secondaryDirection = dirTempD;}
int directionStrength = 0;if( hvd1 > 2 * hvd0 ){directionStrength = 1;}if( hvd1 * 2 > 9 * hvd0 ){directionStrength = 2;}
if( directionStrength ){classIdx += ( ( ( mainDirection & 0x1 ) << 1 ) + directionStrength ) * 5;}//!<几何变换索引计算static const int transposeTable[8] = { 0, 1, 0, 2, 2, 3, 1, 3 };int transposeIdx = transposeTable[mainDirection * 2 + ( secondaryDirection >> 1 )];
4、滤波器参数传输
在VTM5中,ALF滤波器参数在Adaptation Parameter Set (APS)中。在一个APS中,有至多25组亮度滤波器参数和门限值,及至多1组色度滤波器参数和门限值。为了减少比特开销,不同类别的滤波器参数可以merge。当前slice使用的APS索引在slice header中。
APS中可以解码出门限值索引,通过门限值索引可以从亮度门限值列表和色度门限值列表中指定所需的门限值。门限值列表由位深决定:
滤波过程可以在CTB级进行控制,可以传输一个标志位表示是否需要对一个亮度CTB进行ALF滤波。一个亮度CTB使用的滤波器可以从16个固定滤波器和APS提供的滤波器中选择。有一个滤波器索引表示最终使用的滤波器。16个固定滤波器是预定义好的,硬编码进编码器和解码器了。
滤波器参数被量化成均值为128。为了减少乘法的复杂性,需要对码流进行一致性处理以使非中心位置的参数在[-128,127]间。中心位置的参数不需要传输,默认等于128。
5、滤波操作
感兴趣的请关注微信公众号Video Coding
VVC环路滤波(一):ALF相关推荐
- VVC/VTM: 自适应环路滤波(ALF, Adaptive Loop Filtering)中维纳滤波(Wiener Filtering)的公式推导
0 前言 自适应环路滤波(ALF)并不是在 H.266/VVC 标准制定过程中才被提出来的技术,实际上其早在 H.265/HEVC 标准制定时就基本确定了现有形式的雏形,只是由于当时硬件算力的限制未能 ...
- VVC/VTM:环路滤波——Luma mapping with chroma scaling (LMCS)
VTM中环路滤波的顺序:LMCS,deblocking filter,SAO 和ALF.其中deblocking filter和SAO 与HEVC中的相同. Luma mapping with chr ...
- TIP 2019开源论文:基于深度学习的HEVC多帧环路滤波方法
作者丨李天一 学校丨北京航空航天大学博士生 研究方向丨视频编码与深度学习 本文概述的是作者近期在 IEEE TIP 期刊上发表的论文:A Deep Learning Approach for Mult ...
- 视频千倍压缩背后的技术原理之环路滤波
随着5G的成熟和广泛商用,带宽越来越高,让传输视频变得更加容易.移动设备算力的提升.存储容量的提升,也使得视频技术的应用越来越广泛.视频相关的技术,特别是视频压缩技术,因其专业性,深入开发的门槛较高, ...
- DCC2022:环路滤波CCSAO
本文来自DCC2022论文<Cross-component Sample Adaptive Offset> VVC中的环路滤波工具除了传统的DBF.SAO外,还引入了LMCS.ALF.CC ...
- HEVC算法和体系结构:环路滤波技术
环路滤波(In-Loop Filtering)技术 类似于以往的视频编码标准,HEVC仍采用基于块的混合编码框架,一些失真效应仍然存在,如方块效应.振铃效应.颜色偏差以及图像模糊等等.为了解决这些问题 ...
- FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- FFmpeg的HEVC解码器源代码简单分析:环路滤波(Loop Filter)
===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...
- h264解码之环路滤波
代码以ffmpeg为例,h264解码代码在h264.c里. 环路滤波(Loop Filter)部分 FFmpeg的H.264解码器调用decode_slice()函数完成了解码工作.这些解码工作可以大 ...
最新文章
- iOS web与JS交互
- java使用gridview,网格控件GridView在Android中的使用
- 使用Apache Common Daemon实现Windows服务
- 博鳌直击 | 大数据开发的最大障碍是什么?
- 上学帮:阿里云助力教育资讯平台防爬虫
- 用Python盘点那些豆瓣评分低于3.0的奇葩电影
- CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置
- [学习日记] 文件读写 FileStream
- vuex模块化 怎么引用state_vue 组件如何调用 vuex 模块中的getters
- GreenSock动画库在REACT里的使用
- autojs 复制到粘贴板_JS复制到剪贴板示例代码
- HTTPS原理,三分钟轻松搞懂
- mac格式化固态为exFAT格式
- 《鬼谷子》捭阖第一(翻译)
- matlab弦截法例子,弦截法matlab程序
- 中国移动通信互联网短信网关接口协议CMPP2.0(普通文本短信、二进制数据短信)
- Linux用户对文件进行加密
- java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyPreparedStatement.isClosed()Z
- 客户端 cloudera-scm-agent启动报错
- 这是一个浮躁的时代(程序员)