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学习 🚀 欢迎关注:👍点赞 Ǵ…...
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)…...
大数据学习之Flink基础(补充)
Flink基础 1、系统时间与事件时间 系统时间(处理时间) 在Sparksreaming的任务计算时,使用的是系统时间。 假设所用窗口为滚动窗口,大小为5分钟。那么每五分钟,都会对接收的数据进行提交任务. 但是,这里有…...
C++基础语法:友元
前言 "打牢基础,万事不愁" .C的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结. 以<C Prime Plus> 6th Edition(以下称"本书")的内容开展学习 引入 友元提供了一种特别的方式,访问对象私有数据. 友元有三…...
【大模型系列】Video-LaVIT(2024.06)
Paper:https://arxiv.org/abs/2402.03161Github:https://video-lavit.github.io/Title:Video-LaVIT: Unified Video-Language Pre-training with Decoupled Visual-Motional TokenizationAuthor:Yang Jin, 北大&#x…...
【总结】nacos作为注册中心-应用启动失败:NacosDiscoveryProperties{serverAddr=‘127.0.0.1:8848‘……
问题现象 启动springboot应用时报错,能够读取到nacos配置,但是使用nacos作为注册中心,应用注册到nacos失败。 应用配置bootstrap.properties如下: # 应用编码,安装时替换变量 spring.application.namedata-center #…...
C语言——数组和排序
C语言——数组和排序 数组数组的概念数组的初始化数组的特点 排序选择排序冒泡排序插入排序 二分查找 数组 数组的概念 数组是一组数据 ; 数组是一组相同类型的数据或变量的集合 ; 应用场景: 用于批量的处理多个数据 ; 语法&…...
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 二、文件内容 三、介绍 在此处可以修改屏幕的频率,当前为21MHz。 四、总结 注意选择对应的屏幕的参数,sdk所支持的屏幕信息都在此文件夹中…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
