AV1:帧内预测(二)

news2024/11/26 10:22:46

在上一篇文章中介绍了AV1帧内预测的各个工具,本文进一步介绍其中的相关细节。

参考像素准备


帧内预测是利用当前帧已重建的像素预测当前块,和HEVC一样,AV1的帧内预测参考像素来自当前块上方和左侧的重建像素。

对于尺寸为wxh的块,其参考像素获取过程如下:

上方参考像素AboveRow[ i ]  ,i=0,1...w+h-1获取过程:

  • 如果上方相邻像素无效但是左侧相邻像素有效,AboveRow[ i ]=CurrFrame[ plane ][ y ][ x - 1]。

  • 如果上方和左侧相邻像素都无效,AboveRow[ i ]=( 1 << ( BitDepth -1 ) ) - 1。

  • 否则:AboveRow[ i ]=CurrFrame[ plane ][ y-1 ][ Min(aboveLimit, x+i) ]。
    其中aboveLimit=Min( maxX, x + ( haveAboveRight ? 2 * w : w ) - 1 )防止超出图像右边界。

左侧参考像素LeftCol[ i ] ,i=0,1...w+h-1获取过程:

  • 如果上方相邻像素有效但是左侧相邻像素无效,LeftCol[ i ]=CurrFrame[ plane ][ y - 1 ][ x ]。

  • 如果上方和左侧相邻像素都无效,LeftCol[ i ]=( 1 << ( BitDepth -1 ) ) - 1。

  • 否则:LeftCol[ i ]=CurrFrame[ plane ][ Min(leftLimit, y+i) ][ x-1 ]。
    其中leftLimit=Min( maxY, y + ( haveBelowLeft ? 2 * h : h ) - 1 )防止超出图像下边界。

左上角像素AboveRow[ -1 ]获取过程:

  • 如果上方和左侧相邻像素都有效,AboveRow[ -1 ]=CurrFrame[ plane ][ y-1 ][ x-1 ]。

  • 否则,如果上方相邻像素有效AboveRow[ -1 ]=CurrFrame[ plane ][ y-1 ][ x ]。

  • 否则,如果左侧相邻像素有效AboveRow[ -1 ]=CurrFrame[ plane ][ y ][ x-1 ]。

  • 否则,AboveRow[ -1 ]=( 1 << ( BitDepth -1 ) ) - 1。

DC预测模式

DC模式是常用的一种帧内预测模式,主要用于内容平坦的块,它利用参考像素的均值作为当前块的预测值,具体预测像素计算方法如下:

  • 如果上方和左侧参考像素都有效,则计算所有参考像素的均值作为当前块所有像素的预测值:

  • 如果仅左侧参考像素有效:

  • 如果仅上方参考像素有效:

  • 如果左侧和上方参考像素都无效:预测值为1 << ( BitDepth - 1 )

PAETH_PRED模式


PAETH_PRED模式类似于HEVC中的Planar模式,

  

每个位置的预测值就是使上面式子最小的值。

参考像素滤波

语法元素enable_intra_edge_filter表示是否开启对参考像素滤波和上采样过程,

参考像素滤波

对于非90度和180度的角度模式需要对参考像素滤波,过程如下:

1、左上角参考像素滤波,如果pAngle>90且pAngle<180且(w+h)>=24对左上角参考像素用一个3抽头滤波器滤波:

LeftCol[-1]=AboveRow[-1]=LeftCol[ 0 ] * 5 + AboveRow[ -1 ] * 6 + AboveRow[ 0 ] * 5

2、滤波类型计算,这个过程得到filterType ,当上方或左侧使用smooth模式则filterType =1,

3、滤波强度srength计算,它的范围是0到3,由块尺寸、filterType、角度等决定:

strength = 0
if ( filterType == 0 ) {
if ( blkWh <= 8 ) {
if ( d >= 56 ) strength = 1
} else if ( blkWh <= 12 ) {
if ( d >= 40 ) strength = 1
} else if ( blkWh <= 16 ) {
if ( d >= 40 ) strength = 1
} else if ( blkWh <= 24 ) {
if ( d >= 8 ) strength = 1
if ( d >= 16 ) strength = 2
if ( d >= 32 ) strength = 3
} else if ( blkWh <= 32 ) {
strength = 1
if ( d >= 4 ) strength = 2
if ( d >= 32 ) strength = 3
} else {
strength = 3
}
} else {
if ( blkWh <= 8 ) {
if ( d >= 40 ) strength = 1
if ( d >= 64 ) strength = 2
} else if ( blkWh <= 16 ) {
if ( d >= 20 ) strength = 1
if ( d >= 48 ) strength = 2
} else if ( blkWh <= 24 ) {
if ( d >= 4 ) strength = 3
} else {
strength = 3
}
}

其中blkWh =w+h,d是角度差值,如果pAngle<180且haveAbove =1,d=abs(pAngle-90),如果pAngle>90且haveLeft=1,d=abs(pAngle-180)。

4、滤波操作,若srength=0则无需滤波否则需要进行滤波,标准定义了3个5抽头滤波器分别对应3个强度。

Intra_Edge_Kernel[INTRA_EDGE_KERNELS][INTRA_EDGE_TAPS] = {
{ 0, 4, 8, 4, 0 }, //strength=1
{ 0, 5, 6, 5, 0 }, //strength=2
{ 2, 4, 4, 4, 2 }  //strength=3
}

5、上采样,对于有的模式还需要对参考像素进行上采样,首先根据角度和滤波类型判断是否需要上采样

if ( d <= 0 || d >= 40 ) {
useUpsample = 0
} else if ( filterType == 0 ) {
useUpsample = (blkWh <= 16)
} else {
useUpsample = (blkWh <= 8)
}
d和blkWh跟滤波强度计算中的定义一样

如果useUpsample=1则需要进行上采样,上采样过程是2倍上采样,首先需要对参考像素长度加倍

dup[ 0 ] = buf[ -1 ]
for ( i = -1; i < numPx; i++ ) {
  dup[ i + 2 ] = buf[ i ]
}
dup[ numPx + 2 ] = buf[ numPx - 1 ]

然后对半像素位置插值

buf[-2] = dup[0]
for ( i = 0; i < numPx; i++ ) {
  s = -dup[i] + (9 * dup[i + 1]) + (9 * dup[i + 2]) - dup[i + 3]
  s = Clip1( Round2(s, 4) )
  buf[ 2 * i - 1 ] = s
  buf[ 2 * i ] = dup[i + 2]
}

预测值计算

前面得到参考像素并完成滤波后就可以利用对各种角度模式计算预测值,预测块尺寸wxh,对于i=0...h-1,j=0...w-1计算pred[i][j]。

Dr_Intra_Derivative[ 90 ] = {0, 0, 0, 1023, 0, 0, 547, 0, 0, 372, 0, 0, 0, 0,273, 0, 0, 215, 0, 0, 178, 0, 0, 151, 0, 0, 132, 0, 0,116, 0, 0, 102, 0, 0, 0, 90, 0, 0, 80, 0, 0, 71, 0, 0,64, 0, 0, 57, 0, 0, 51, 0, 0, 45, 0, 0, 0, 40, 0, 0,35, 0, 0, 31, 0, 0, 27, 0, 0, 23, 0, 0, 19, 0, 0,15, 0, 0, 0, 0, 11, 0, 0, 7, 0, 0, 3, 0, 0}

  

如果pAngle<90,按以下方式生成pred[i][j]:

  如果90<pAngle<180,按以下方式生成pred[i][j]:

如果pAngle>180,按以下方式生成pred[i][j]:

  如果pAngle=90,则pred[i][j]=AboveRow[j],j=0..w-1,i=0..h-1。

 如果pAngle=180,则pred[i][j]=Leftcol[i],j=0..w-1,i=0..h-1。

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

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

相关文章

Vue 阶段练习:记事本

将 Vue快速入门 和 Vue 指令的学习成果应用到实际场景中&#xff08;如该练习 记事本&#xff09;&#xff0c;我们能够解决实际问题并提升对 Vue 的技能掌握。 目录 功能展示 需求分析 我的代码 案例代码 知识点总结 功能展示 需求分析 列表渲染删除功能添加功能底部统计…

正在海外乘风破浪的扫地机器人,手握怎样的发展利器?

“懒人经济”能造就多大的市场&#xff0c;可以从扫地机器人行业的发展窥见。 据国际数据分析机构捷孚凯报告&#xff0c;截至2022年底&#xff0c;我国扫地机器人已占据50%以上的海外市场份额。其中&#xff0c;科沃斯、石头科技等头部企业成为出海的“主力军”。 以石头科技…

网工内推 | 等保测评工程师,朝九晚六,周末双休,有相关认证优先

01 江苏国保测评中心 招聘岗位&#xff1a;等保测评工程师 职责描述&#xff1a; 1.测评类项目的物理安全测评、主机安全测评、数据安全测评、应用安全测评、风险评估、差距分析等并编制相关报告; 2.协助业务部门完成网络安全等级保护测评、信息安全咨询、信息安全风险评估等项…

4.配置USART串口实现printf打印

通过TTL转USB实现电脑和单片机连通,是我们调试必不可少的工具 查看原理图,使用USART1,它们的TX和RX分别在PA9和PA10 新建Usart.c存放串口模块的初始化 这段代码是复制了正点原子的工程,添加到前面 #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos 使用 …

rhce.定时任务和延迟任务项目

一 . 在系统中设定延迟任务要求如下&#xff1a; 在系统中建立 easylee 用户&#xff0c;设定其密码为 easylee 延迟任务由 root 用户建立 要求在 5 小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有 root 用户和easylee用户可以…

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程&#xff0c;不做其他的深入的讲解 Github和Gitlab的操作类似&#xff0c;只不过Github叫PR&#xff0c;GitLab叫MR&#xff0c;基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架&#xff0c;在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&…

225 基于matlab的天牛须优化算法及其对BP神经网络的优化

基于matlab的天牛须优化算法及其对BP神经网络的优化&#xff0c;优化后的阀值权值赋予网络预测。最后输出BP和BAS-BP训练和预测结果。程序已调通&#xff0c;可直接运行。 225 天牛须优化算法 BP神经网络 - 小红书 (xiaohongshu.com)

如何降低漏测, 避免上线后出bug,6年测试心得分享

一、漏测原因总结 &#xff08;1&#xff09;需求评审质量低&#xff0c;需求设计简单、只是简单描述功能&#xff0c;功能逻辑较少   &#xff08;2&#xff09;需求变更频繁   &#xff08;3&#xff09;缺少需求分解&#xff08;sql 文档、用例设计&#xff09;   &…

2024.4.16

三个按键的中断 do_irq.c #include "mykey.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取中断号unsigned int irqno (GICC->IAR&0x3ff);switch (irqno){case 99://中断处理逻辑printf("KEY1_INTC\n&q…

【免费领取源码】可直接复用的医院管理系统!

今天给大家分享一套基于SpringbootVue的医院管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文中自取) 系统运行图&#xff08;设计报告和接口文档&#xff09; 1、后台管理页面 2、排班管理页面 3、设计报告包含接口文档 源码免费领取方式 后台私信…

第一届AI Agent智能体现场开发大赛报名开启!8月上旬火热开赛~

由联想拯救者、AIGC开放社区、英特尔携手主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”已经正式启动&#xff0c;“2024 AI Agent极限挑战赛”作为特设专项赛道&#xff0c;也将同步于8月上旬开赛&#xff0c;参赛者将在更加紧张刺激的现场比赛中展现其技术与创造力。…

Redis-缓存击穿-逻辑过期

Redis-缓存击穿-逻辑过期实现 缓存击穿&#xff1a;也称热点key问题&#xff0c;大量访问一个key&#xff0c;而这个key恰巧到期了&#xff0c;导致大量的请求访问数据库。增大数据库的负担。为了解决这个问题可以采用互斥锁或逻辑过期的方式解决。本章采用逻辑过期的方式解决…

【Entity Framework】你知道如何处理无键实体吗

【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型&#xff1a;6…

【Git】初识 Git

文章目录 1. 提出问题2. 如何解决&#xff1f;版本控制器3. 注意事项 1. 提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种文档时&#xff0c;为了防止文档丢失、更改失误、失误后能恢复到原来的版本&#xff0c;不得不复制出一个副…

TensorFlow实战 PDF书籍分享

今天又来给大家推荐一本大模型方面的书籍<TensorFlow实战>。《TensorFlow实战》希望用简单易懂的语言带领大家探索TensorFlow&#xff08;基于1.0版本API&#xff09;。 本书讲述了TensorFlow的基础原理&#xff0c;TF和其他框架的异同。并用具体的代码完整地实现了各种…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例-汇总

github求⭐ 可通过github 地址和npm 地址查看全部内容,范例Ⅰ、Ⅱ、Ⅲ、Ⅳ免VIP查阅 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅱ)搜索及数据获取…

[Java EE] 多线程(一) :线程的创建与常用方法(上)

1. 认识线程 1.1 概念 1.1.1 什么是线程 ⼀个线程就是⼀个"执⾏流".每个线程之间都可以按照顺序执⾏⾃⼰的代码.多个线程之间"同时"执⾏ 着多份代码. 还是回到我们之前的银⾏的例⼦中。之前我们主要描述的是个⼈业务&#xff0c;即⼀个⼈完全处理⾃⼰的…

十大排序——9.桶排序

这篇文章我们来介绍一下桶排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 桶排序和计数排序一样&#xff0c;都不是基于比较进行排序的。 下面通过一个例子来理解一下桶排序吧。 首先&#xff0c;给你一个无序数组[ 20,18,28,66,25,31,67,30 ]&#xff0c;然后&#…

CANoe中LIN工程主节点的配置(如何切换调度表)

1&#xff1a;前置条件 1&#xff09;工程已经建立&#xff0c;simulation窗口已经配置好&#xff08;包括且不限于通道mappin好&#xff0c;数据库文件已经添加&#xff09; 2&#xff09;我已系统自带sampleCfg工程&#xff0c;作为例子。如下图 2 &#xff1a;主节点的配置…