视频编解码 - 帧间预测

news2024/11/18 3:49:13

目录

帧间预测

块大小

参考帧和运动矢量

运动矢量

运动搜索

1、全搜索算法

2、钻石搜索算法(菱形搜索算法)

3、六边形搜索算法

搜索起始点的确定

快速搜索与全搜索的优缺点

非整像素的处理

亚像素差值

亚像素精度运动搜索

运动矢量预测

SKIP模式


帧间预测

        前后两帧图像变化比较小,视频的时间相关性。比较容易从前一帧中找到一个跟当前编码块差距很小的块作为预测块,这样编码块减去预测块得到的残差块的像素值很多都是0,压缩效率很高。

        通过在已经编码的帧里找到一个块来预测待编码的像素,从而达到减少时间冗余的目的。

        帧间预测可以在多个已经编码的图像里去寻找参考像素块,称之为多参考。单参考和多参考其底层原理是一样的,只是多参考需要多搜索去寻找参考块。

帧间预测的帧类型        

       P帧,只要参考前面的帧

       B帧   既可以参考前面的图像也可以参考后面的图像。B帧一个编码块可以有两个预测块,这两个预测块分别由两个参数预测得到。最后加权得到最终预测的块。

下面看下P帧单参考帧的预测原理

块大小

相比帧内预测,帧间预测的块划分类型要很多。

宏块大小16x16,可以划分为 16x8 8x16 8x8三种。其中8x8 可以继续划分为 8x4,4x8和 4x4,这是亮度块的划分。

在YUV 4:2:0中,色度快宽高大小都是亮度块的一半。亮度宏块的划分方式如下图所示。

参考帧和运动矢量

在H264标准中,P帧最多支持16个参考帧中选出一个作为编码块的参考帧,其中一个帧中的不同块可以选择不同的参考帧,这就是多参考

通常在RTC场景中,P帧中的所有块都参考同一个参考帧,并且一般会选择当前编码帧的前一帧作为参考帧。

运动矢量

        表示编码帧中编码块和参考帧中预测块之间位置的差值

运动搜索

目标在参考帧中找到一个块,称之为预测块,并且这个预测块与编码块的差距最小。

运动搜索的方法

1、全搜索算法

        逐个像素遍历,一定能找到最相似的预测块

        缺点:浪费时间

搜索块的左上角像素点

2、钻石搜索算法(菱形搜索算法)

        以一个菱形的模式去寻找最优预测块。

        思想:以搜索的起始点作为菱形的中心点开始。以该中心点为左上角像素的16X16的块作为预测块,求得残差块并求得像素绝对值之和。

        之和对菱形4个点分布做同样的操作,求得SAD(残差块像素值绝对值之和),选择最小的为最佳匹配点。

        如果最佳匹配点再菱形中心,则终止搜索;

        如果不是菱形中心,则以当前最佳匹配点为中心点,继续搜索,直到找到最佳匹配点。

 

 

3、六边形搜索算法

        思想:

        搜索起始点作为六边形中心点,求得中心点左上角像素的预测块的SAD,之后对六边形角上的点做同样的操作求得SAD,得到最小的SAD,为最佳匹配点。

        如果最佳匹配点为中心点,测以改中心点的菱形和正方形各进行一次精细化搜索。找到中心点,菱形四个点和正方形四个点中最小的SAD为最佳匹配点。

        如果最佳匹配点不是六边形的中心点,则以当前最佳匹配点为六边形的中心,继续搜索。直到找到为止。

 

搜索起始点的确定

        当前编码块的左边块,右边块,左上角块,右上角块的的运动矢量。一般会通过相邻已经编码块的运动矢量来预测当前块的运动矢量,这个预测的运动矢量也常用作搜索起点。

快速搜索与全搜索的优缺点

        快速搜索速度快很多,但预测到的块不一定是全局最优预测块,有可能是局部最优预测块。

        快速搜索算法相比全搜索算法压缩性能下降很小,速度却块十几倍到几十倍。一般选择快速搜索。

       

如何物体运动不是整像素如何处理?

非整像素的处理

        运动0.5像素或者0.25像素,预测块是与编码块的小车位置相差0.5或者0.25像素,得到的残差会大,压缩效率低一些。

        解决办法:用差值的方式将半像素和1/4像素算出来,也当一个像素。

亚像素差值

        通过已经有的像素点经过一定的加权计算得到要求得的像素。

        先通过整像素差值得到半像素,然后再通过半像素和整像素差值得到1/4像素

半像素差值在参考帧中差值得到一辆新的小车,从而就可以解决之前预测块和编码块位置不重合问题。但插值得到的小车跟原始的小车的对应像素点的像素值并不是完全一样(插值得到的像素点是利用滤波算法加权平均得到)

因此 半像素差值得到的预测块并不一定比整像素预测块的残差小,只是多了选择块

在整像素预测块、半像素预测块和1/4预测块里选择一个最好的

在整像素运动搜索的基础上,再做一次精细的亚像素运动搜索。

亚像素精度运动搜索

1、先通过快速搜索算法进行像素运动搜索算法得到整像素的运动矢量

2、对参考帧进行半像素和1/4像素差值

3、以整像素运动矢量指向的整像素为起点,进行砖石搜索算法。分别求得中线点及上、下左右

四个半像素点对应预测的残差块,得到SAD值,取SAD值最小的点为最佳匹配点

4,以半像素运动搜索的最佳匹配点为起点,分别求得上下左右四个1/4像素点对应预测块的残差块,得到SAD值,取得最小的点为最佳匹配点。

运动矢量直接编码到码流中吗?不是的

运动矢量预测

运动矢量先用周围相邻快的运动矢量预测一个预测的运动矢量,称为MVP。将当前运动矢量与MVP的残差称之为MVD,然后编码到码流中去。MVP+MVD就是运动矢量了。

 

思想:

取当前块左边块A,上边块B,右上块C。如果右上块不存在或者参考帧与当前编码宏块不同,则使用左上块D替代C。

求得A,B,C块的参考帧有多少个与当前编码块的参考帧相同,即为count

如果count > 1,则取A,B,C块运动矢量的中值

如果count = 1,则直接将这个块的运动矢量作为MVP

如果 count=1,并且B,C都不存在,则直接将A作为运动矢量为MVP

如果上述条件不满足,则取A,B,C块运动矢量的中值。

SKIP模式

运动矢量MVP,也就是说MVD为(0,0),同时残差块经过变化量化后系数都是等于0,那么当前编码的模式是SKIP

压缩效率特别高

帧间预测算法过程如下(以单参考帧为例)

1、先判断当前宏块是不是可以作为SKIP块(通过相邻已经编码的块是不是存在SKIP块,和当前块使用MVP做运动矢量之后,残差块变换量化后是不是都是0等算法来判断)如果可以作为SKIP块则模式选择结束。

2、宏块大小16x16,先不划分宏块,直接使用16X16大小的块,在参考帧中进行运动搜索,得到运动矢量和预测块,通过MVP求得MVD,通过预测块得到残差块,并求得残差块的SATD值(残差块经过Hadamard变换之后求得绝对值再求和),估计MVD的编码后占用的字节数,将两个值加起来作为cost16x16

3、将16x16块划分为4个8x8的子块,分别进行运动搜索,并求得每一个8X8子块的MVD和残差块,最后分别得到4个cost8x8

1)如果4个8x8子块之和小于16x16块的cost16x16的话,再分别对每一个8x8子块划分成4个4x4子块,再进行运动搜索,得到每一个4x4子块的cost4x4

如果4个costx4x之和小于cost8x8,则将8x8划分成4x8 和 8x4两种子块,分别求得cost4x8和cost8x4,再根据4个cost4x4和2个cost4x8 2个cost8x4的大小,选择最终的8x8划分的方式,并将对应的cost值更新到cost8x8

否则不进行划分。

2)如果4个8x8子块的最新的cost8x8之和还是小于cost16x16的话,再将16x16划分成两个8x16和16x8子块,并分别求得cost8x16和cost16x8,对比x8x 8x16 16x8的值,并最终确定16x16块的划分方式。

否则不进行划分。

4,得到了编码宏块的帧间模式之后,还需要对编码块进行帧内模式的选择。在p帧和B帧的宏块也是可以使用帧内模式。需要看帧间模式cost更小还是帧内模式cost更小。选择其中小的一个。一般来说P帧和B帧宏块大多数是帧间模式小。

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

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

相关文章

双十二蓝牙耳机哪款好?双十二平价蓝牙耳机推荐

对于许多人来说,音乐即是生活良药,带给我们生活、工作和学习的动力,若想要随时随地都能来上一剂,那么买到一款划算平价的真无线蓝牙耳机便是优秀的选择。 一、南卡小音舱蓝牙耳机 蓝牙:5.3 延迟:45ms 发…

npm、yarn到pnpm的发展历程

npm、yarn到pnpm的发展历程背景价值点npm发展及存在的问题npm v1(树状结构)安装原则优点不足:npm v3(扁平化结构)安装原则优点:不足:目录结构不确定依赖A先安装依赖A后安装npm v5优点npm包分身定…

mysql全文索引

引用:https://www.cnblogs.com/miracle-luna/p/11147859.html MySQL 5.7.6之前只支持英文全文索引,不支持中文全文索引,,需要利用分词器把中文段落预处理 拆分成单词,,然后存入数据库 MySQL 5.7.6 开始&am…

FSK/OOK 调制单发射芯片CMT2119A-ESR/CMT2119B-EQR

FSK/OOK 调制单发射芯片CMT2119A-ESR/CMT2119B-EQR CMT2119A 是 HopeRF 旗下CMOSTEK 无线产品线 FSK/OOK 调制单发射芯片,CMT2219A 则是与之对应的 FSK/OOK 调制单接收芯片,均支持 Sub-1G 应用无线发射芯片CMT2119A主要应用: 无线遥控开关、…

接口设计与优化

文章目录接口的注意事项获取对象的属性或方法,先 判断对象是否为空!修改老接口,思考接口的兼容性重点接口,考虑线程池隔离调用第三方接口考虑超时、重试接口的熔断、降级接口,需要考虑限流接口要打印好日志接口考虑热点…

ETF动量轮动+RSRS择时,RSRS修正标准分,回撤降至16%

原创文章第113篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。 昨天的策略我是比较满意的,沿着进化的方向在迭代我们的策略。ETF轮动RSRS择时,加上卡曼滤波:年化48.41%,夏普比1.89 我们会持…

Linux从入门到精通(十)——进程管理

文章篇幅较长,建议先收藏,防止迷路 文章跳转Linux从入门到精通(八)——Linux磁盘管理goLinux从入门到精通(九)——Linux编程goLinux从入门到精通(十)——进程管理goLinux从入门到精…

Go Web项目 接口开发全流程

风离不摆烂学习日志 Day5 — Go Web项目 接口开发全流程 接上篇地址 Web项目学习之项目结构 routes包分析 InitRoutes package routesimport ("fmt""github.com/gin-gonic/gin""go-web-mini/common""go-web-mini/config""go-we…

Charles断点

1、断点测试的含义 1.1、断点(英语:Breakpoint)是程序中为了调试而故意停止或者暂停的地方。 调试设置断点:可以让程序运行到该行程序时停住,借此观察程序到断点位置时,其变量、寄存器、I/O等相关的变量内…

mysql InnoDB 索引结构

目录 前言 1. InnoDB常见的索引 2. B树索引 2.1 二分查找法 2.2 二叉查找树 2.3 平衡二叉树 2.4 B树索引 2.5 B树索引 2.5.1 聚集索引 2.5.2 非聚集索引 2.5.3 聚集索引与非聚集索引区别 前言 索引的本质是让mysql以最高效、扫描行数最少的方式找到需要的数据。索引…

Paper写作怎么了解题目方面的重要性?

我们常听到:Paper的好坏,从选择题目开始!可见选择Paper题目的重要性。这正是我们今天要探讨的内容。 We often hear that the quality of paper starts from choosing the topic!This shows the importance of selecting paper topics.This i…

数字信号处理-9-离散余弦变换

1 波形合成 假定给一系列振幅和一系列频率,要求构建一个信号,此信号是这些频率元素的和。这样的操作就是合成 def synthesize(amps, fs, ts):"""amps 振幅数组fs 频率数组ts 采样时间点"""# ts 和 fs 的外积&#xff0c…

Spring Cloud(十三):Spring 扩展

Spring扩展点 Bean的生命周期中的BeanPostProcessor扩展点Spring扩展点梳理 Spring扩展点应用场景 整合Nacos 服务注册 ApplicationListener扩展场景——监听容器中发布的事件Lifecycle Nacos 发布订阅 & Eureka 服务启动、同步、剔除Lifecycle扩展场景——管理具有启动、停…

JSP快速入门

目录 1、jsp简述 2、JSP快速入门 2.1、搭建环境 2.2、导入JSP页面 2.3、编写代码 2.4、启动测试 3、JSP原理 4、JSP脚本 4.1、JSP脚本的分类 4.2、案例 4.2.1、需求 4.2.2、实现 ​编辑 4.2.3、测试 ​编辑4.3、JSP缺点 5、JSP语法 5.1、JSP页面的基本结构…

【每日一题Day36】LC1742盒子中小球的最大数量 | 哈希表 找规律

盒子中小球的最大数量【LC1742】 You are working in a ball factory where you have n balls numbered from lowLimit up to highLimit inclusive (i.e., n highLimit - lowLimit 1), and an infinite number of boxes numbered from 1 to infinity. Your job at this facto…

[附源码]java毕业设计养老院管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C++ 语言学习 day10 复习(2)

1.友元 的三种形式 /*********** 友元 ************ * ①全局函数做友元 * ②类做友元 * ③类成员函数做友元 * **************************/ 代码&#xff1a; #include <iostream> #include <string> using namespace std;/* ③类函数友元 : 程序规则{ 自上…

Charles下载抓包基本流程

一、Charles官网下载链接&#xff1a; https://www.charlesproxy.com/download/ 二、抓包步骤&#xff1a; 1、安装Charles&#xff0c;并打开 2、电脑设置代理端口&#xff1a; 打开charles->Proxy->Proxy Settings,设置代理端口&#xff0c;如图所示 3、手机设置代…

Day10--配置uni-app的开发环境

1.啥子是ui-app呢&#xff1f; 1》官方介绍&#xff1a; 2》博主介绍 ************************************************************************************************************** 2.开发工具建议使用HBuilder X *************************************************…

BSA/HSA表面修饰二甘醇酐,人血清白蛋白HSA、牛血清白蛋白BSA偶联二甘醇酐

BSA作用&#xff1a; BSA一般做为稳定剂被用于限制酶或者修饰酶的保存溶液和反应液中&#xff0c;因为有些酶在低浓度下不稳定或活性低。加入BSA后&#xff0c;它可能起到“保护”或“载体”作用&#xff0c;不少酶类添加 BSA后能使其活性大幅度提高。不需要加BSA的酶加入BSA一…