当前位置: 首页 > news >正文

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

运动补偿(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区域内,对仿射参数需要满足下面两个条件

​  

相关文章:

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

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

数学建模(5)——逻辑回归

一、二分类 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklea…...

【C++高阶】:深入探索C++11

✨ 心似白云常自在,意如流水任东西 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 &#x1f4…...

6. 自定义Docker镜像

如何自定义Docker镜像:从基础到实践 Docker作为一个容器化平台,使得应用的打包、分发和运行变得更加高效和便捷。本文将详细介绍如何自定义一个Docker镜像,包括镜像的构成、分层原理、创建自定义镜像的具体步骤,并演示如何打包和…...

「12月·长沙」人工智能与网络安全国际学术会议(ISAICS 2024)

人工智能与网络安全国际学术会议(ISAICS 2024)将于2024年12月20日-2024年12月22日在湖南长沙召开。会议中发表的文章将会被收录,并于见刊后提交EI核心索引。会议旨在在为国内与国际学者搭建交流平台,推进不同学科领域的融合发展,就当今人工智能与网络安全范畴内各学…...

【技术支持案例】使用S32K144+NSD8381驱动电子膨胀阀

文章目录 1. 前言2. 问题描述3. 理论分析3.1 NSD8381如何连接电机3.2 S32K144和NSD8381的软件配置 4.测试验证4.1 测试环境4.2 测试效果4.3 测试记录 1. 前言 最近有客户在使用S32K144NSD8381驱动电子膨胀阀时,遇到无法正常驱动电子膨胀阀的情况。因为笔者也是刚开…...

第二期:集成电路(IC)——智能世界的微观建筑大师

嘿,小伙伴们!👋 我是你们的老朋友小竹笋,一名热爱创作和技术的工程师。上一期我们聊了聊AI芯片,这次我们要深入到更微观的层面,来探究集成电路(IC)的世界。准备好一起探索了吗&#…...

基于物联网的区块链算力网络,IGP/BGP协议

目录 基于物联网的区块链算力网络 IGP/BGP协议 IGP(内部网关协议) BGP(边界网关协议) 内部使用ISP的外部使用BGP的原因 一、网络规模和复杂性 二、路由协议的特性 三、满足业务需求 四、结论 基于物联网的区块链算力网络 通 过 多个物联网传感器将本地计算…...

每日一题~960 div2 A+B+C(简单奇偶博弈,构造,观察性质算贡献)

A题意: N 长的数组。 一次操作: 最开始的mx 为零。 选出一个数(使得这个数>mx) ,之后将mx 更新为这个数,将这个数置为零。 不能做这个操作的,输。 问是否有先手赢的策略。有的话,输出yes 否则no 当时一…...

音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程

音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...

Aboboo一些操作

常用快捷键⌨ 快捷键/操作方式 功能 鼠标中键/Esc 进入/退出全屏 空格/Tab 暂停/恢复播放 左/右箭头 快退/快进 Ctrl-左/右箭头 30秒快退/快进 Alt-左/右箭头 60秒快退/快进 Ctrl-Alt-左/右箭头 播放速率调节 PageUp/PageDown 上一句/下一句 上下箭头/滚轮 …...

获取行号LineNumberReader

(每日持续更新)jdk api之LineNumberReader基础、应用、实战-CSDN博客...

python数据结构与算法

0.时间复杂度和空间复杂度 快速判断算法时间复杂度:算法运行时间 1.确定问题规模n 2.循环减半 logn 3.k层关于n的循环 n^k 空间复杂度:评估算法内存占用大小 使用几个变量 O(1) 使用长度为n的一维列表 O(n&#xff09…...

大数据学习之Flink基础(补充)

Flink基础 1、系统时间与事件时间 系统时间(处理时间) 在Sparksreaming的任务计算时,使用的是系统时间。 假设所用窗口为滚动窗口,大小为5分钟。那么每五分钟,都会对接收的数据进行提交任务. 但是,这里有…...

C++基础语法:友元

前言 "打牢基础,万事不愁" .C的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结. 以<C Prime Plus> 6th Edition(以下称"本书")的内容开展学习 引入 友元提供了一种特别的方式,访问对象私有数据. 友元有三…...

【大模型系列】Video-LaVIT(2024.06)

Paper&#xff1a;https://arxiv.org/abs/2402.03161Github&#xff1a;https://video-lavit.github.io/Title&#xff1a;Video-LaVIT: Unified Video-Language Pre-training with Decoupled Visual-Motional TokenizationAuthor&#xff1a;Yang Jin&#xff0c; 北大&#x…...

【总结】nacos作为注册中心-应用启动失败:NacosDiscoveryProperties{serverAddr=‘127.0.0.1:8848‘……

问题现象 启动springboot应用时报错&#xff0c;能够读取到nacos配置&#xff0c;但是使用nacos作为注册中心&#xff0c;应用注册到nacos失败。 应用配置bootstrap.properties如下&#xff1a; # 应用编码&#xff0c;安装时替换变量 spring.application.namedata-center #…...

C语言——数组和排序

C语言——数组和排序 数组数组的概念数组的初始化数组的特点 排序选择排序冒泡排序插入排序 二分查找 数组 数组的概念 数组是一组数据 &#xff1b; 数组是一组相同类型的数据或变量的集合 &#xff1b; 应用场景&#xff1a; 用于批量的处理多个数据 &#xff1b; 语法&…...

QEMU 新增QMPHMP指令【原文阅读】

文章目录 0x0 QEMU原文0x10x11 How to write monitor commands0x12 Overview0x13 Testing 0x20x21 Writing a simple command: hello-world0x22 Arguments 0x30x31 Implementing the HMP command 0x40x41 Writing more complex commands0x42 Modelling data in QAPI0x43 User D…...

【Linux】全志Tina配置屏幕时钟的方法

一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\device\config\chips\c200s\configs\F1C200s\sys_config.fex 二、文件内容 三、介绍 在此处可以修改屏幕的频率&#xff0c;当前为21MHz。 四、总结 注意选择对应的屏幕的参数&#xff0c;sdk所支持的屏幕信息都在此文件夹中…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...