【视频编码\VVC】环路滤波基础知识

本文为新一代通用视频编码H.266\VVC原理、标准与实现的简化笔记。

定义:在视频编码过程中进行滤波,滤波后的图像用于后续编码。

目的:1、提升编码图像的质量。2、为后续编码图像提供高质量参考,获得更好的预测效果。

VVC中主要采取的技术有:色度与亮度缩放(Luma Mapping Chroma Scaling, LMCS)、去方块滤波(De-Blocking Filter, DBF)、样点自适应补偿(Sample Adaptive Offset, SAO)、自适应滤波(Adaptive Loop Filter, ALF)。

DBF用于降低方块效应、SAO用于改善振铃效应、ALF可以减少解码误差,在编码环路中,一般是先去方块滤波、样点自适应补偿和自适应环路滤波的顺序。LMCS一般对编码前的图像进行预处理。

亮度映射与色度缩放

包括两个部分:1、基于自适应分段线性模型的亮度映射;应用在像素级,利用亮度值范围及广电转换特性来提高视频的编码效率。2、基于亮度的色度残差缩放:应用在色度块级,通过补偿亮度信号映射对色度信号的影响。

解码端LMCS框架结构如下图所示:

LMCS技术

基本思想:在指定的位深下更好地使用允许的亮度值范围。

10bit视频亮度值范围为[64,940]。在编解码过程中,前向映射将范围[64,940]映射到[0,1023]中,再进行变换、量化等模块的处理。或者一个亮度范围较小的视频,没有充分利用允许的亮度值,因此LMCS就是将原始域亮度值映射到允许的亮度值范围。

基于分段线性模型的亮度映射

VVC中,前向映射函数FwdMap使用一个分段线性模型,反向映射函数InvMap为逆函数。

根据视频的位深将原始域的码值范围划分为16个相等的片段,每个片段的码字数量由OrgCW表示,变量InputPivot[i]表示原始域内各片段的边界点。

InputPivot[i] = i * OrgCW;

映射域内各片段的边界点表示MappedPivot[i],MappedPivot[i+1]-MappedPivot[i]的值就是映射域中第i个片段的亮度值个数,表示为SignalledCW[i]

色度缩放

前向缩放将原始域色度值转换到映射域,有

C_{Resscale} = C_{res}*C_{scale} = C_{res}/C_{Invscale}

色度缩放以TU为单位,同一个TU使用相同的缩放因子,也使用分段线性模型,同一个片段色度缩放因子相同。色度缩放偏移量deltaCRS由自适应参数集LMCS_APS标识。

LMCS的实现

介绍的是VTM中使用的LMCS模型参数的构建方法,对于SDR\HDR-PQ\HDR-HLG视频的特性不同,模型参数不同。对于SDR和HDR-HLG视频,基于局部亮度方差,针对PSNR指标进行优化。对于HDR-PQ视频,针对加权PSNR进行优化,基本思想为空间平滑区域分配相比复杂区域更多的码字。

  • SDR\HDR-HLG视频

1、统计分析视频内容,在原始域划分片段,分配初始码字

2、根据图像内容调整片段的码字数量

3、如果分配的码字总数大于允许的最大码字数,从第一个片段开始,每个片段减少相同的数量,知道妈祖条件,得到最终每个片段分配的码字数量SignalledCW[i].

4、根据亮度样本映射前后的相对值及平均局部方差,确定LMCS片类型、高码率自适应和色度调整自适应参数。

  • HDR-PQ视频

1、计算映射模型曲线的斜率

2、积分映射模型曲线的斜率

3、归一化

4、计算每个片段的码字数量。

LMCS的相关语法元素

SPS层

sps_lmcs_enabled_flag:为1的时候标识使用LMCS

PH层

ph_lmcs_enabled_flag:当前图像是否使用LMCS

ph_lmcs_aps_id:当前按图片中的slice所应用的LMCS APS的aps_adaptation_parameter_set_id

ph_chroma_residual_scale_flag:当前图片是否使用色度残差缩放

SH层

sh_lmcs_used_flag:当前slice是否使用LMCS

APS层

lmcs_min_bin_idx:LMCS过程中使用的最小bin索引

lmcs_delta_max_bin_idx:最大bin索引与15之间的差值

lmcs_delta_cw_prec_minus1:加1用于kmcs_delta_abs_cw[i]的比特数

lmcs_delta_abs_cw[i]:第i个区间的码字绝对增量值

lmcs_delta_sign_cw_flag[i]:标识变量LmcsDeltaCW[i]的符号

lmcs_delta_abs_crs:表示变量LmcsDeltaCrs的绝对码字值

lmcs_delta_sign_crs_flag:表示变量LmcsDeltaCrs的符号

去方块滤波

方块效应:图像中编码块边界的不连续性。因为各块的变换量化编码过程相互独立,导致相邻块边界的不连续性。因为在运动补偿的过程中,相邻块的预测值可能来自不同图像的不同位置,可能导致预测残差信号在块边界产生数值不连续的问题。会传递到后续编码图像。

H.264、H.265就采用了环路去块滤波,能够自适应的根据不同的视频内容、不同的编码方式选择不同强度的滤波参数,对其进行平滑处理。

H.266针对采用子块编码技术的子块边界进行滤波,针对大块亮度分量的长抽头滤波,针对色度分量的强滤波。去块滤波模块会对CU边界、变换子块边界(SBT\ISP模式及大尺寸CU隐式分割时引入的变换单元边界)及预测子块边界(SbTMVP模式和仿射模式引入的预测单元边界)进行滤波处理。

基本步骤:

  • 先确定带滤波的边界,确保去块滤波过程应用于所有的子块边界和CU边界。
  • 遵循先亮度分量后色度分量,先垂直方向后水平方向的原则对CU中含有的边界进行滤波。边界两侧采用滤波操作的像素数由边界两侧块的大小决定。

去块滤波包括两个环节:滤波决策和滤波操作。去块滤波算法对不同的视频内容及不同的编码参数具有自适应的能力,对不同的块边界自适应选择是否滤波、边界的滤波强度及最大滤波长度。

滤波决策

目的:对所有满足滤波尺寸条件的边界,根据视频内容及编码参数,确定最大滤波航长度、边界的滤波强度及滤波参数。

1、获取最大滤波长度

根据CU的大小、子块的大小、子块与CU边界的距离初步确定相邻块的每行最多可修改的像素个数。

2、获取边界的滤波强度(BS)

根据边界块的编码参数初步判断边界块是否需要滤波及其滤波参数。

3、滤波强度的选择

根据人眼的掩盖效应,只有平坦区域的不连续块边界才是滤波的对象,而滤波操作也会消除强纹理区域应有的纹理信息。需进一步对视频内容进行分析,根据边界两侧块内像素值的变化和编码参数确定。根据边界块内像素值的变化程度判断内容特性,也根据边界区域的内容特性判断。

滤波强度分为:不滤波、短抽头滤波(分为强滤波、弱滤波)、长抽头滤波。

会根据像素的变化率和平坦度计算出边界区域纹理度,值越大,表示区域越不平坦。纹理度大到一定程度,关闭滤波。阈值与量化参数设计有关。

H.266中新增了基于亮度分量强度的自适应去方块滤波(luma-adaptive de-blocking filter)。根据重建像素的平均亮度水平为QP添加偏移量去调整去方块滤波强度,用来补偿在线性光域使用非线性转换函数造成的失真。

对于色度分量,较为平坦,所以不需要计算平坦度。

滤波操作

滤波操作包括的类型

  • 亮度分量的长抽头滤波
  • 亮度分量的短抽头强滤波
  • 亮度分量的短抽头弱滤波
  • 色度分量的强滤波
  • 色度分量的弱滤波

长抽头滤波的目的是保留块边界处的斜面或线性信号,针对大块边界修改更多的像素值,滤波器与像素位置相关。

相关语法

sps层

sps_virtual_boundaries_enabled_flag是否允许环内滤波过程跨越虚拟边界

sps_virtual_boundaries_enabled_flag虚拟边界信息是否在SPS层中存在

pps层

pps_loop_filter_across_tiles_enabled_flag标识tile的边界处是否执行环路滤波操作

pps_loop_filer_across_slice_enabled_flag标识slice的左边界及上边界处是都执行环路滤波操作

pps_deblocking_filter_control_present_flag标识PPS层中是否存在控制去方块滤波的语法元素

pps_deblocking_filter_override_enabled_flag标识Slice头部是否存在语法元素pps_deblocking_filter_override_enabled_flag

pps_deblocking_filter_diabled_flag在pps_deblocking_filter_diabled_flag不存在的情况下,是否对各个slice执行去方块滤波

ph层

ph_luma_beta_offset_div&ph_luma_tc_offset_div2去方块滤波参数默认的补偿值

sh层

sh_deblocking_params_present_flag标识slice头部是否存在去方块滤波

sh_deblocking_filter_disabled_flag标识当前slice是否进行去方块滤波

sh_luma_beta_div2&sh_luma_tc_offset_div2当前slice的去方块滤波参数的补偿值

样点自适应补偿

H.266采用基于块的变换,并在频域对变换系数机型量化,由于高频变换系数的量化失真,解码后会在边缘周围产生波纹现象,称为振铃效应

样点自适应补偿技术:从像素域入手抑制振铃效应,对重建曲线中出现的波峰增加负值,对波谷增加正值。

SAO技术

H.2662中的SAO技术以CTB为基本单位,对不同类型的像素使用不同的补偿值。

补偿形式:边界补偿(EO)和边带补偿(BO)

边界补偿

通过比较当前像素与相邻像素的大小对当前像素进行归类,对同类像素补偿相同数值。使用一维3像素分类模式

边界补偿分为4种模式:水平方式、垂直方式、135°方向、、45°方向。在任意一种模式,将重建像素归为5个种类。对应谷状、凹角、凸角、峰状。

边带补偿

根据像素强度进行归类,将像素范围分为32条边带,同一边带使用相同的补偿值。一个CTB只能选4条连续的边带,只对这4条边带的像素进行补偿。

SAO参数融合

参数融合是指对于一个CTB,其SAO参数直接使用相邻块的SAO参数。

SAO实现

1、快速SAO模式判别

SAO最终的补偿模式可以从8种情况中选择:不补偿、EO_0模式、EO_1模式、EO_2模式、EO_3模式、BO模式、左相邻参数融合模式、上相邻块参数融合模式。对于非参数融合模式,像素又被分为很多类,每类有多个候选补偿值。

通常通过率失真性能选择最优的一组SAO参数(模式、补偿值、边带信息)

2、在VTM10.0种的实现

整体流程:信息统计、亮度分量CTB的SAO模式、色度分量CTB的SAO模式、CTU的最优SAO模式、CTU的SAO滤波。

自适应环路滤波

ALF技术包括亮度ALF、色度ALF、和分量间的ALF。基于维纳滤波原理,通过原始图像信息和重建图像信息建立维纳-霍夫方程求解一系列最小误差的滤波器系数。

维纳滤波

是一种使滤波输出与期望输出间均方无法最小的线性滤波器。求偏导求解线性方程组可以得到一组滤波系数使滤波输出与期望输出间的MSE最小。维纳滤波器系数与重建图像内容无关。有效权衡滤波器性能和滤波器系数数量需要进行考虑。

ALF技术

VVC中根据视频内容自适应地在有限个滤波系数集中选择一组滤波器,对重建视频进行滤波。

滤波系数集包含M个滤波器子集,每个滤波器子集包含与视频内容相关的N类滤波器。解码端针对每个CTU,ALF根据子集缩影确定滤波器子集,根据像素块的内容确定滤波器类,即可以确定该像素块使用的滤波器系数。编码端根据像素块内容确定滤波器类,然后哦利用率失真确定最优滤波器子类,并对子集索引进行编码。

滤波器系数集:包括固定子集和APS子集。

亮度ALF

滤波系数集包含16个固定子集和最多8个APS子集,每个子集包含25组滤波器类。

滤波器子集

VVC中,亮度ALF包含16个固定子集,共包含64组滤波系数。根据子集索引和类别,查表得到滤波器编号。再根据滤波器编号,查表得到对应相应滤波器的系数。

滤波器类

更具内容特性,选择一个滤波器类。

1、拉普拉斯梯度

2、方向性因子D:体现梯度方向

3、活动性因子A:体现梯度的强弱,查表获得

4、滤波器类:索引为filtIdx = 5D+A

滤波器模板

以中心对称的7x7菱形。每组滤波系数对应4种滤波器模板:不变换、对角线变换、垂直翻转、旋转变换。

利用4个梯度方向确定滤波器模板的变换方式。

滤波过程

根据之前得到的7x7滤波器模板,对4x4亮度块中的每个像素进行滤波处理。

滤波器构建

将slice分为4x4的块,根据梯度计算每个4x4块的方向性和活动度,进而得到每个块的滤波器类。针对每个滤波器类,将所采用该滤波器的4x4块作为一个整体,利用维纳-霍夫方程,求该滤波器类的系数。

优化方法

  • 不对所有的CTU进行ALF
  • APS滤波系数需要编码传输,合并减少25类滤波器可以提高压缩效率。

色度ALF

比较简单,只使用APS子集。对色度分量,每个APS子集都包含8组滤波器。采用中心对称的5x5菱形滤波器模板。不需要对滤波器模板进行变换。针对色度分量,将slice分为8个区域,每个区域内分别包含连续整数个CTU,为每个区域计算一组滤波器系数,得到8组滤波器。

分量间ALF

利用亮度值进行CCALF,对色度值进行补充和修正。可以通过亮度信息进行ALF补偿色度分量的细节,改善色度分量的重建质量。对于色度分量,每个APS子集包含4个滤波器,采用3x4的菱形滤波器模板。通过减弱CCALF在高QP编码区域的应用防止产生色度纹理过丰富的伪影。

参数过多,详见标准定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2806233.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ的死信队列和延迟队列

文章目录 死信队列如何配置死信队列死信队列的应用场景Spring Boot实现RabbitMQ的死信队列 延迟队列方案优劣:延迟队列的实现有两种方式: 死信队列 1)“死信”是RabbitMQ中的一种消息机制。 2)消息变成死信,可能是由于…

RuntimeError: CUDNN_STATUS_EXECUTION_FAILED

问题描述: 运行代码时候报错: 原因:pytorch与cuda版本不对,需要重新安装。不过我在复现代码的时候一般是要求特定的环境,不然会有其他错误,所以选择其他解决办法。 解决方案: 在train.py开头…

跨界计算与控制,强化显控和UI, 君正MPU再添新旗舰--Ingenic MPU X2600隆重发布

近日,北京君正隆重发布MPU芯片新产品X2600。该产品以商业和工业应用的数个细分领域为重点目标市场,兼顾通用处理器应用需求。无论从CPU结构的设计,还是专门控制器和接口的配备,都体现了北京君正MPU团队“技术路线上追求自主跨界&a…

鸿蒙开发之Profiler性能分析

一、Profiler性能分析器简介 应用或服务的性能较差时,可能表现为响应速度慢、动画播放不流畅、卡顿、崩溃或极其耗电。为了避免出现这些性能问题,需要通过一系列性能分析工具来确定应用或服务对哪方面资源(例如CPU、内存、显卡、网络和设备电池)的使用率比较高。DevEco St…

代码随想录算法训练营day25|216.组合总和III

216.组合总和III 题目链接/文章讲解:代码随想录 视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili 跟77题差不多,要搞清楚k确定了递归的深度 依旧用回溯三部…

Facebook的数字社交使命:连接世界的下一步

在数字化时代,社交媒体已成为人们生活的重要组成部分,而Facebook作为其中最具影响力的平台之一,一直以来都在努力履行着自己的使命——连接世界。然而,随着时代的变迁和技术的发展,Facebook正在不断探索着连接世界的下…

【Logback】Logback 日志框架的架构

目录 1、Logger(记录器) (1)有效级别和级别继承 (2)日志打印和日志筛选 (3)记录器命名 2、Appenders(追加器) 3、Layouts(布局)…

提示工程(Prompt Engineering)、微调(Fine-tuning) 和 嵌入(Embedding)

主要参考资料: 还没搞懂嵌入(Embedding)、微调(Fine-tuning)和提示工程(Prompt Engineering)?: https://blog.csdn.net/DynmicResource/article/details/133638079 B站Up主Nenly同学…

智能高压森林应急消防泵|保障森林安全|深圳恒峰

随着科技的不断发展,我们的生活质量得到了显著提升。在森林保护领域,一项创新技术正在发挥着关键作用——智能高压森林应急消防泵。这种设备不仅提高了灭火效率,更为森林资源的安全保驾护航。 在过去,面对森林火灾,消防…

学习Python分支结构不走弯路

1.单分支语句 """ 语法: if 表达式:执行语句 执行流程:当表达式成立的时候,执行语句,否则不执行 """age int(input(请输入你的年龄:)) if age > 18:print(欢迎光临!) …

PyTorch基础:Tensor类型张量的构建与相互转换

PyTorch基础:Tensor类型张量的构建与相互转换 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订…

【Java】Java基础(实验一)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握Java程序的编辑、调试与运行;了解Java引用类型,掌握数组的定义和引用。掌握Java基本数据类型和输入输出。掌握Java程序结构 二、实验内容 1.JDK的环境变量设置及测试。 &#xff08…

2023年12月CCF-GESP编程能力等级认证C++编程六级真题解析

一、单选题(共15题,共30分) 第1题 关于C++类和对象的说法,错误的是( )。 A:在C++中,一切皆对象,即便是字面量如整数5等也是对象 B:在C++中,可以自定义新的类,并实例化为新的对象 C:在C++中,内置函数和自定义函数,都是类或者对象 D:在C++中,可以在自定义函数中…

fly-barrage 前端弹幕库(1):项目介绍

fly-barrage 是我写的一个前端弹幕库,由于经常在 Bilibili 上看视频,所以对网页的弹幕功能一直蛮感兴趣的,所以做了这个库,可以帮助前端快速的实现弹幕功能。 项目官网地址:https://fly-barrage.netlify.app/&#xff…

c++获取本地所有IP地址,以及域名解析

#include <iostream> using namespace std; #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <WinSock2.h> #pragma comment(lib,"WS2_32.lib")class CInitSock { public:CInitSock(){//必须要注册网络库WSADATA wsd;if (::WSAStartup(MAKEWORD(2, 2)…

【k8s资源调度-Deployment】

1、标签和选择器 1.1 标签Label 配置文件&#xff1a;在各类资源的sepc.metadata.label 中进行配置通过kubectl 命令行创建修改标签&#xff0c;语法如下 创建临时label&#xff1a;kubectl label po <资源名称> apphello -n <命令空间&#xff08;可不加&#xff0…

【SpringBoot】Spring常用注解总结

目录 ⭐spring springmvc和springboot的区别 Autowired 和Resource的区别和联系 1. SpringBootApplication 2. Spring Bean 相关 2.1. Autowired 2.2. Component,Repository,Service, Controller 2.3. RestController 2.4. Scope 2.5. Configuration 3. 处理常见的 HT…

CentOS和Ubuntu之间的区别和联系

CentOS&#xff08;Community ENTerprise Operating System&#xff09;和Ubuntu是两种流行的Linux发行版&#xff0c;它们在企业和个人用户中都有广泛的应用。尽管它们都是基于Linux内核&#xff0c;但它们在设计理念、更新策略、包管理系统等方面存在一些关键的区别和联系。下…

力扣 724. 寻找数组的中心下标

思路&#xff1a; 创建两个变量sum和sum1&#xff0c;sum代表左边元素的和&#xff0c;sum1代表右边元素的和 然后假设从数组下标0开始&#xff0c;一直到最后一个作为中心下标 如果sumsum1&#xff0c;返回此时的中心下标 如果所有下标循环完了&#xff0c;发现没有return…

Sqli-labs靶场第8关详解[Sqli-labs-less-8]

Sqli-labs-Less-8 前言&#xff1a; SQL注入的三个条件&#xff1a; ①参数可控&#xff1b;&#xff08;从参数输入就知道参数可控&#xff09; ②参数过滤不彻底导致恶意代码被执行&#xff1b;&#xff08;需要在测试过程中判断&#xff09; ③参数带入数据库执行。&#…