H.265/HEVC编码原理及其处理流程的分析
H.265/HEVC编码原理及其处理流程的分析
H.265/HEVC编码的框架图,查了很多资料都没搞明白,各个模块的处理的分析网上有很多,很少有把这个流程串起来的。本文的主要目的是讲清楚H.265/HEVC视频编码的处理流程,不涉及复杂的计算过程。
文章目录
- H.265/HEVC编码原理及其处理流程的分析
- 一、什么是H.265/HEVC?
- 1.1、H.265/HEVC的作用
- 1.2、H.265/HEVC编码框架
- 二、DCT变换和量化
- 2.1、DCT变换
- 2.2、 量化
- 三、H265的预测
- 3.1、帧内预测
- 3.2、帧间估计
- 3.3、 预测方式的选择
- 四、环路滤波
- 五、总结
- 六、参考资料
一、什么是H.265/HEVC?
1.1、H.265/HEVC的作用
♈️H.265/HEVC是一种新的视频压缩标准,而视频是由一张张连续的图片组成的,因此对视频的压缩就可以理解为对一组图片的压缩。30帧的视频就表示一秒有30张的图片,60帧就表示该视频一秒有60张图片,对视频的压缩,就是对一组图片的压缩。由于一个视频里相邻的图片间常常存在大量相同的部分。比如这两张照片,相似度就很高,没必要两张都完整的存储下来。
♉️一张图片是由很多像素点组成,即使同一张图片内部也存在大量相同的部分,比如这张图片的背景几乎全是白色,我们没有必要把每个白色的位置及其像素值全部存储下来,这样既耗费资源又没有必要。
♊️因此,H.265/HEVC主要采用帧内预测(根据同一张图片的其他位置的像素点预测当前位置的像素值), 或者帧间预测(根据其他图片的像素,来推测当前图片) 对组成视频的图片进行压缩,以减少他们的大小。
1.2、H.265/HEVC编码框架
♋️H.265/HEVC的编码框架如图所示,图片来源【1】,本文的主要目的是为了讲清楚这张图展示的处理流程。首先,输入的图片被划分为一个个相似的块(CTU),这些块的大小最大为64*64,通过这样的划分,使得每个CTU的差别都不大。通过合理的划分CTU,可以将图片划分成相似度较高的一个个CTU块,这就是H.265/HEVC的第一步操作
。
二、DCT变换和量化
2.1、DCT变换
♌️当一个视频,也就是一组图片的一个CTU输入时,我们先将其进行DCT变换`。
♍️由于我们人眼对高频信息不敏感
,比如一张白纸上写一个字,我们对高频率出现的背景白色并不敏感,黑色线条虽然占据较小的比例,但这低频率出现的黑色信号才是我们关注的重点。该图是某个图片经过DCT变换后的结果,由图可以看出(图片来源【2】),DCT变换后得到频域矩阵,低频部分幅度很大(左上角低频,右下角高频),而高频部分幅度较低
。
2.2、 量化
♎️ 为了减少存储数据所需要的内存资源。CTU经过DCT变换后,我们再将其进行量化
。由于量化步长选取的不一样,造成的精度损失也不一样(参考【3】)。举个例子,如果我们选最小步长是1,向下取整,那么0.6,0.2都将被量化为0,412.6就会被量化为412。可以看到,高频信号由于幅度较小,因此量化后的损失很大,而低频信号由于幅度较大,因此影响较小。毕竟普通人丢了100块钱和富豪丢了100块钱损失是不一样的。
♏️通过DCT变换和量化,在尽可能保持低频、敏感(容易被人眼察觉)信息情况下,对图片进行了压缩
。
三、H265的预测
3.1、帧内预测
♐️ 我们通过DCT变换和量化后,要先经过反DCT变换和量化,恢复图像,才能进行进一步预测;恢复的图像和原始图像比,已经是在尽可能保持低频、敏感(容易被人眼察觉)信息情况下,对图片进行了压缩。
♑️ 如第一节所说,由于同一张图片中各个块之间有较强的关联性,且一个CTU块内部的相似度也很高,因此提出了一种帧内预测压缩算法,比如一个图像为
[ 0 2 2 3 0 2 1 3 0 2 2 2 0 1 2 3 ] (2) \begin{bmatrix} 0 & 2 & 2 & 3 \\ 0 & 2 & 1 & 3 \\ 0 & 2 & 2 & 2 \\ 0 & 1 & 2 & 3 \end{bmatrix} \tag{2} 0000222121223323 (2)
♒️ 我们只保留最上面一行的数据【0,2,2,3】,解压缩时,下面几行都直接复制这一行就可以恢复图像
[ 0 2 2 3 0 2 2 3 0 2 2 3 0 2 2 3 ] (2) \begin{bmatrix} 0 & 2 & 2 & 3 \\ 0 & 2 & 2 & 3 \\ 0 & 2 & 2 & 3 \\ 0 & 2 & 2 & 3 \end{bmatrix} \tag{2} 0000222222223333 (2)
♓️ 如图可知,恢复后的图像与原始图像依然有差异,这个差异的成为残差,因此我们不仅要保存帧内压缩的压缩模式(本文只提到了一种),还需要保存残差
。DCT变换和量化的意义已经在上节提到过了,我们对残差也是保存通过DCT变换和量化后的残差
。
3.2、帧间估计
♓️ 前面也说到了,视频里连续的图片相似度很高
,因此H.265/HEVC引入了帧间编码。这个CTU块跟其他哪张图片相似(ref_idx),跟相似图片的具体哪个CTU块相似(mvd),只需要保存ref_idx,和mvd即可,同样的,相似的这个CTU跟当前CTU的差距,依然按残差系数输出
3.3、 预测方式的选择
⛎ H265将各种预测模式所造成的图片的失真(ΔD)和保存这些压缩后的信息所消耗的资源(R)进行计算代价函数(ΔJ),最终选择代价函数最小的模式进行预测,并输出其残差
;
四、环路滤波
🔯由于CTU的处理方式,和高频信号损失的原因,因此我们恢复信号时,还需要增加一个去方块滤波和SAO滤波【4】,来减小预测后的图像和原始图像的差距(即,进一步减小残差)。
五、总结
- 🅰️H265先通过DCT变换和量化对图像进行处理,消除其一些不敏感的高频信息,减小信息量
- 🅱️H265选择一种代价函数最小的预测方式(帧内预测,或帧间预测),对图像进行压缩;
- 🆎压缩后的图像,直接恢复的话,和原始图像差距过大,因此需要进行环路滤波缩小这段差距
- 🅾️环路滤波后,依然存在误差,误差也需要被保留(DCT变换和量化后保留)
简单来说,H265就是通过一系列预测算法对视频进行压缩,再将因此产生的和原始图像的差异(残差,失真)保存。解压缩时,就可以通过反预测,加残差的方式恢复图像
。
六、参考资料
-
【1】新一代高效视频编码H.265/HEVC:原理、标准与实现,作者:万帅、杨付正;
-
【2】 CSDN博客: JPEG压缩原理与DCT离散余弦变换
-
【3】CSDN博客:pytorch量化中torch.quantize_per_tensor()函数参数详解
-
【4】振铃效应与样点自适应补偿(Sample Adaptive Offset,SAO)技术
相关文章:

H.265/HEVC编码原理及其处理流程的分析
H.265/HEVC编码原理及其处理流程的分析 H.265/HEVC编码的框架图,查了很多资料都没搞明白,各个模块的处理的分析网上有很多,很少有把这个流程串起来的。本文的主要目的是讲清楚H.265/HEVC视频编码的处理流程,不涉及复杂的计算过程。…...

数据结构初阶--链表OJⅡ
目录 前言相交链表思路分析代码实现 环形链表思路分析代码实现 环形链表Ⅱ思路分析代码实现 复制带随机指针的链表思路分析代码实现 前言 本篇文章承接上篇博客,继续对部分经典链表OJ题进行讲解 相交链表 先来看题目描述 思路分析 这道题我们还是首先来判断一…...
离职or苟住?
面对不太好的大环境,我们什么时候该离职,什么时候不应该离职呢?分享几个观点,希望对你有所启发。 以前就有大佬讲过,离职无非是两个原因,一是因为薪资不到位,二是因为受委屈了,总之&…...

微服务之以nacos注册中心,以gateway路由转发服务调用实例(第一篇)
实现以nacos为注册中心,网关路由转发调用 项目版本汇总项目初始化新建仓库拉取仓库项目父工程pom初始化依赖版本选择pom文件如下 网关服务构建pom文件启动类配置文件YMLnacos启动新建命名空间配置网关yml(nacos)网关服务启动 用户服务构建pom文件启动类配置文件YML新增url接口配…...

主成分分析(PCA)直观理解与数学推导
近期在完成信息论的作业,发现网上的资料大多是直观解释,对其中的数学原理介绍甚少,并且只介绍了向量降维,而没有介绍向量重构的问题(重构指的是:根据降维后的低维向量来恢复原始向量)࿰…...

什么是合伙企业?普通合伙和有限合伙区别?
1.什么是合伙企业? 合伙企业是指由各合伙人订立合伙协议,共同出资,共同经营,共享收益,共担风险,并对企业债务承担无限连带责任的营利性组织。合伙企业一般无法人资格,不缴纳企业所得税,缴纳个…...
系统结构考点之不明白的点
系统结构考点系列 计算机系统结构的定义计算机组成的定义计算机实现的定义计算系统的定量设计?1. 哈夫曼压缩原理2. Amdahl定律3. cpu性能公式4. 程序访问局部性定理 这样的题已经不多了,主要是要了解下概念。打下一个好的基础。 2023年4月份成绩已经…...

Android中AIDL的简单使用(Hello world)
AIDL:Android Interface Definition Language(Android接口定义语言) 作用:跨进程通讯。如A应用调用B应用提供的接口 代码实现过程简述: A应用创建aidl接口,并且创建一个Service来实现这个接口(…...

ZED使用指南(五)Camera Controls
七、其他 1、相机控制 (1)选择视频模式 左右视频帧同步,以并排格式作为单个未压缩视频帧流式传输。 在ZED Explorer或者使用API可以改变视频的分辨率和帧率。 (2)选择输出视图 ZED能以不同的格式输出图像…...
wrk泛洪攻击监控脚本
wrk泛洪攻击介绍 WRK泛洪攻击(WRK Flood Attack)是一种基于WRK工具进行的DDoS攻击(分布式拒绝服务攻击)。WRK是一个高度并行的HTTP负载生成器,可以模拟大量用户访问一个网站,从而导致该网站服务器瘫痪或失效…...

软件I2C读写MPU6050代码
1、硬件电路 SCL引到了STM32的PB10号引脚,SDA引到了PB11号引脚软件I2C协议: 用普通GPIO口,手动反转电平实现协议,不需要STM32内部的外设资源支持,故端口是可以任意指定MPU605在SCL和SDA自带了两个上拉电阻,…...

销售/回收DSOS254A是德keysight MSOS254A混合信号示波器
Agilent DSOS254A、Keysight MSOS254A、 混合信号示波器,2.5 GHz,20 GSa/s,4 通道,16 数字通道。 Infiniium S 系列示波器 信号保真度方面树立新标杆 500 MHz 至 8 GHz 出色的信号完整性使您可以看到真实显示的信号࿱…...

RIDGID里奇金属管线检测仪故障定位仪维修SR-20KIT
里奇RIDGID管线定位仪/检测仪/探测仪维修SR-20 SR-24 SR-60 美国里奇SeekTech SR-20管线定位仪对于初次使用定位仪的用户或经验丰富的用户,都同样可以轻易上手使用SR-20。SR-20提供许多设置和参数,使得大多数复杂的定位工作变得很容易。此外,…...

NodeJs之调试
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉。 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了。 但是也别泰国担心,NodeJs的调试是很不方便!这是肯定的。 但是还好&…...

Java面试知识点(全)- Java并发-多线程JUC二-原子类/锁
Java面试知识点(全) 导航: https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 JUC原子类 什么是CAS CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值…...

CSS--移动web基础
01-移动 Web 基础 谷歌模拟器 模拟移动设备,方便查看页面效果 屏幕分辨率 分类: 物理分辨率:硬件分辨率(出厂设置)逻辑分辨率:软件 / 驱动设置 结论:制作网页参考 逻辑分辨率 视口 作用&a…...

Appuploader 常见错误及解决方法
转载:Appuploader 常见错误及解决方法 问题解决秘籍 遇到问题,第一个请登录苹果开发者官网 检查一遍账号是否有权限,是否被停用,是否过期,是否有协议需要同意,并且在右上角切换账号后检查所有关联的账号是否…...

消息通知之系统层事件发布相关流程
前言 Openharmony 3.1Release中存在消息通知的处理,消息通知包括系统层事件发布、消息订阅、消息投递与处理,为了开发者能够熟悉消息的处理流程,本篇文章主要介绍系统层事件发布的相关流程。 整体流程 代码流程 发布消息 { eventAction)w…...

Elsevier Ocean Engineering Guide for Authors 解读
文章目录 ★Types of contributions★Submission checklistEthics in publishing★Declaration of competing interestDeclaration of generative AI in scientific writingSubmission declaration and verificationPreprint posting on SSRNUse of inclusive languageReportin…...

基于Fragstats的土地利用景观格局分析
土地利用以及景观格局是当前全球环境变化研究的重要组成部分及核心内容,其对区域的可持续发展以及区域土地管理有非常重要的意义。通过对土地利用时空变化规律进行分析可以更好的了解土地利用变化的过程和机制,并且通过调整人类社会经济活动,…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...