AV1帧间预测(二):运动补偿

news2024/11/27 2:22:38

运动补偿(Motion Compensation,MC)是帧间预测最基础的工具,AV1支持两种运动补偿方式,一种是传统的平移运动补偿,另一种是仿射运动补偿。下面分别介绍这两种运动补偿方法。

平移运动补偿


平移运动补偿是最传统的运动补偿方式,H.264/H.265的运动补偿都是这种方式,待编码块根据运动向量(Motion Vector,MV)在参考帧中寻找预测块,这个过程便是运动搜索。

AV1的运动搜索支持1/8像素精度,对于非整像素位置使用可分离的插值滤波器生成子像素。

图1 子像素插值

子像素的生成过程如图1,首先进行水平插值,然后再进行垂直插值。对于插值滤波器,如果截止频率高则会更多的保留高频分量,如果截止频率低则会去除更多的高频分量。在VP9中,插值滤波器可以自适应的在3种8抽头滤波器中选择,每种滤波器对应不同的截止频率,选定一种滤波器后水平和垂直方向都使用该滤波器。AV1在VP9的基础上允许水平和垂直方向选择不同的滤波器,每个方向可以从3种滤波器中选择,截止频率由低到高分别为SMOOTH、REGULAR和SHARP。图2是水平和垂直方向选择各种滤波器的热力图。

图2 插值滤波器热力图

为了降低解码复杂度,SMOOTH和REGULAR使用6抽头滤波器,SHARP使用8抽头滤波器。三种滤波器对应的半像素插值的滤波系数如下,

为了降低最坏情况下的复杂度(所有块都划分到4x4),某一维度小于等于4的块只允许使用两种4抽头滤波器进行半像素插值且没有SHARP滤波器。

仿射运动补偿


仿射模型参数估计

除了平移运动,视频内容很可能还包含旋转、缩放等仿射运动,AV1支持仿射运动补偿,通过仿射变换模型将(x,y)处的像素投影到(x',y'),

      (1)

其中h_ij是仿射变换系数,(h13,h23)是平移因子和平移运动中的mv作用相同,h11和h22控制着水平和垂直方向的缩放,h11、h12、h21、h22共同控制旋转。

AV1共有两种affine mode,一种是全局affine mode,和参考帧相绑定,编码块可以根据参考帧索引使用对应的全局模型。平移因子(h13,h23)使用15比特精度编码,4个非平移因子h11、h12、h21、h22使用12比特精度编码。全局模型主要捕获整体的旋转和缩放特征,更关注整体的运动。

另一种affine mode是编码块级的局部模型,然而如果对每个块都传输affine参数将会消耗大量码率,因此AV1使用空域相邻块的mv来估计affine mode参数。局部模型中平移因子(h13,h23)类似于mv在码流中显示传输,其他4个参数使用相邻块mv估计得到。编码器会扫描最近相邻块,寻找和当前块参考帧相同的块作为候选项(最多8个候选项),利用候选项的mv来计算仿射模型参数。对每个候选项计算它的中心坐标相对当前块中心坐标的偏移当作变换前的位置,这个偏移值加上两个块间的mvd作为变换后的位置,用最小二乘法计算变换前后位置即可求解出模型参数。

图3 局部仿射模型参数估计

以图3为例,(xi,yi)是第i个块的中心坐标,mvi是对应运动向量。按Blk1到Blk7的顺序遍历相邻块,选择和当前块参考帧相同的块,这里选中Blk1、Blk2、Blk5和Blk7。

首先计算中心坐标偏移值作为变换前的位置,

  

对应变换后为位置为,

  

由仿射变换公式(1)可得,

  

将4个块变换前后的坐标带入上面公式即可用最小二乘法求得仿射变换的非平移参数h11、h12、h21、h22。

  

注意,为了保证空域相关性若mvd任何一个分量的绝对值超过8个像素则不使用该参考块,同时如果有效参考块数量小于2则无法用最小二乘法求解则不能使用局部仿射模型。

仿射运动估计


得到仿射模型后便可以对编码块使用仿射运动估计,即通过仿射运动找到每个像素在参考图像中对应的坐标得到预测像素。仿射运动只对8x8及以上的块才能使用,对于大于8x8的块首先将其划分为8x8子块,对每个8x8子块的中心坐标通过平移运动因子(h13,h23)计算在参考图像中对应的坐标,如同4中当前块中心(x0,y0)在参考图像中对应的坐标为(x1,y1),块中其他像素(x,y)以(x1,y1)为中心进行旋转和缩放得到仿射变换后的坐标(x',y'),

图4 仿射预测

AV1中仿射预测是1/64像素精度,使用8抽头滤波器(角点位置使用6抽头滤波器)进行​分像素插值。如图1所示,普通的平移​运动可以复用子像素插值的中间结果从而减少计算量。对于8x8的块插值,首先利用15x15区域内的像素使用水平插值生成15x8的​中间结果,然后在中间结果上使用垂直插值生成8x8块。水平插值需要(15x8)x8=960次乘法,垂直插值需要(8x8)x8=512次乘法,总共需要1472次乘法。

而仿射变换后的每个像素偏移值可能不同,导致无法复用中间插值结果,如果直接进行插值计算需要64x8x8=​4096次乘法。为了减少计算量,仿射变换可以通过两次错切变换完成(关于错切的定义可自行百度),

  

上面式子的右边第一部分是垂直错切矩阵,第二部分​是水平错切矩阵。对8x8块的仿射变换分为两个阶段,首先使用水平错切求得15x8的中间结果获得水平位置偏移值

  

然后在中间结果上使用垂直错切得到垂直偏移值

  

最终得到8x8的预测块,总共需要1472​次乘法运算。

为了使插值使用的像素限制在15x15区域内,对仿射参数需要满足下面两个条件

​  

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

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

相关文章

vscode docker 查看

以root权限启动vscode sudo code --no-sandbox --disable-gpu-sandbox --user-data-dir/root/.vscode/安装docker插件

C++ | Leetcode C++题解之第307题区域和检索-数组可修改

题目&#xff1a; 题解&#xff1a; class NumArray { private:vector<int> tree;vector<int> &nums;int lowBit(int x) {return x & -x;}void add(int index, int val) {while (index < tree.size()) {tree[index] val;index lowBit(index);}}int p…

基于Django与spark的国漫推荐系统

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 近年来&#xff0c;随着互联网的蓬勃发展&#xff0c;企事业单位对信息的管理提…

数据库安全:MySQL文件权限的安全问题和解决方案

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…

Windows本地构建镜像推送远程仓库

下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库&#xff08;harbor&#xff09; 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…

RabbitMQ快速入门(MQ的概念、安装RabbitMQ、在 SpringBoot 项目中集成 RabbitMQ )

文章目录 1. 补充知识&#xff1a;同步通讯和异步通讯1.1 同步通讯1.2 异步通讯 2. 同步调用的缺点2.1 业务耦合2.2 性能较差2.3 级联失败 3. 什么情况下使用同步调用4. 异步调用5. 异步调用的优点和缺点5.1 异步调用的优点5.1.1 解除耦合&#xff0c;拓展性强5.1.2 无需等待&a…

智能座舱背后主流车机平台(SA8155/SA8295)的高通Hexagon DSP是什么?

智能座舱背后主流车机平台(SA8155/SA8295)的高通Hexagon DSP是什么&#xff1f; 一、高通Hexagon DSP的辉煌发展历程 高通&#xff0c;作为全球领先的无线通信技术创新者&#xff0c;其处理器技术一直走在行业前列。随着智能手机和物联网设备的普及&#xff0c;对处理器性能的…

排序算法:冒泡排序,golang实现

目录 前言 冒泡排序 代码示例 1. 算法包 2. 冒泡排序代码 3. 模拟排序 4. 运行程序 5. 从大到小排序 循环细节 外层循环 内层循环 总结 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 冒泡排序的适用场景 1. 数据量非…

大数据-55 Kafka sh脚本使用 与 JavaAPI使用 topics.sh producer.sh consumer.sh kafka-clients

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

WireShark看tcp网速

1、过滤对应的tcp流 2、统计->TCP流图形->窗口尺寸 3、"接收通过窗口值/时间" 可以得到tcp的接收速度

强化学习时序差分算法之Sarsa算法——以悬崖漫步环境为例

1.导入必要的库环境&#xff0c;代码如下所示。 import matplotlib.pyplot as plt import numpy as np from tqdm import tqdm 2.本悬崖漫步环境中无需提供奖励函数以及状态转移函数&#xff0c;而需提供一个与智能体进行交互的step()函数&#xff0c;该函数输入为智能体当前…

Python time模块格式化时间的N种技巧

文末赠免费精品编程资料~~ 是不是经常对着电脑屏幕上的日期时间发呆&#xff0c;心想&#xff1a;“要是能随心所欲地格式化这些数字就好了。”今天&#xff0c;我们就一起探索Python中的时间宝藏——time模块&#xff0c;让你轻松玩转时间显示&#xff0c;从新手进阶为时间格…

AI算力的新时代:智算中心的挑战与创新

随着AI的发展&#xff0c;作为AI三要素算法、数据、算力中的基础设施——算力首先迎来了高速的发展。智算中心作为AI时代承载算力的关键基础设施&#xff0c;在政策、市场的双重驱动下进入了高速建设周期&#xff0c;其在推动数字经济发展和技术进步方面发挥着重要作用&#xf…

【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下)

【Gin】深度解析&#xff1a;在Gin框架中优化应用程序流程的责任链设计模式(下) 大家好 我是寸铁&#x1f44a; 【Gin】深度解析&#xff1a;在Gin框架中优化应用程序流程的责任链设计模式(下)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&#xf…

数学建模--微分方程

目录 常见的微分方程模型 微分方程建模的基本步骤 代码示例 常微分方程 ​编辑 ​编辑 偏微分方程 ​编辑 应用实例 结论 如何在数学建模中准确识别和选择合适的微分方程模型&#xff1f; 微分方程模型在解决实际问题中的应用案例有哪些&#xff1f; 常微分方程&a…

SpringBoot整合FFmpeg进行视频分片上传

SpringBoot整合FFmpeg进行视频分片上传------>Windows 分片上传的核心思路&#xff1a; 将文件按一定的分割规则&#xff08;静态或动态设定&#xff0c;如手动设置20M为一个分片&#xff09;&#xff0c;用slice分割成多个数据块。为每个文件生成一个唯一标识Key&#xf…

ONNX模型的量化

我们都希望从代码中榨取更多的性能&#xff0c;对吧&#xff1f; 在现代&#xff0c;充斥着需要大量计算资源的复杂机器学习算法&#xff0c;因此&#xff0c;榨取每一点性能至关重要。 传统上&#xff0c;机器学习算法是在具有支持大量并行计算能力的 GPU 上进行训练的。但是…

WordPress建站:如何使用ChemiCloud搭建外贸独立站

以前自行搭建一个网站&#xff0c;不懂一点技术那是很难完成的&#xff0c;现如今WordPress的出现极大地降低了搭建网站的技术门槛&#xff0c;不需要懂任何代码&#xff0c;只需按步骤操作就行。WordPress 是一个非常流行的开源内容管理系统&#xff08;CMS&#xff09;&#…

职业教育计算机网络综合实验实训室建设应用案例

近年来&#xff0c;职业教育在培养技能型人才方面发挥着越来越重要的作用。然而&#xff0c;传统的计算机网络技术教学模式往往重理论、轻实践&#xff0c;导致学生缺乏实际操作能力和职业竞争力。为了改变这一现状&#xff0c;唯众结合职业教育特点&#xff0c;提出了“教、学…

Kubeflow v1.7.0 创建新用户

文章目录 为新用户创建配置文件配置用户密码重启auth生效 为新用户创建配置文件 apiVersion: kubeflow.org/v1beta1 kind: Profile metadata:name: kubeflow-cyw-example-com # replace with the name of profile you want, this will be users namespace name spec:owner:k…