系统化学习 H264视频编码(06)哥伦布编码解读

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的起源以及各个概念的联系。知其然,知其所以然。同时更强调知识系统的建立。

针对本文,我们主要研究上一篇文章(系统化学习 H264视频编码(05)码流数据及相关概念解读)中提到的 H.264码流中的数据编码,也就是哥伦布编码。解读为什么要使用哥伦布编码以及哥伦布编码到底是怎么计算的。

1 为什么H264编码中使用哥伦布编码来编码来压缩数据?

我们将其拆分成2个问题:为什么H264编码中使用熵编码来压缩数据,以及为什么使用熵编码中的哥伦布编码来编码。

1.1 为什么H264编码中使用熵编码来压缩数据?

在视频编码中,熵编码方法被广泛使用,主要是因为它能够有效地减少数据的冗余,从而提高压缩效率。以下是使用熵编码方法的几个关键原因:

  1. 信息熵的概念: 信息熵是度量信息的不确定性的量。熵编码方法的核心思想是为更可能发生的事件分配更短的编码,从而最小化总体编码长度,接近信息熵的理论极限。

  2. 利用数据的统计特性: 视频数据具有明显的统计规律性,例如在自然场景中相邻像素之间存在很强的相关性。熵编码利用这些统计特性,通过为高频事件分配短码字,为低频事件分配长码字,实现数据的有效压缩。

  3. 无损压缩: 熵编码是一种无损压缩方法,这意味着原始视频数据可以从压缩后的数据完全恢复,不损失任何信息。

  4. 适应性: 熵编码可以适应各种不同的数据源和不同的编码场景。它可以动态地根据数据的实际分布调整编码策略。

  5. 减少存储和传输成本: 通过减少视频数据的大小,熵编码可以显著降低存储成本和网络带宽需求,这对于视频的存储和传输尤为重要。

  6. 提高编码效率: 熵编码通常作为视频编码流程的最后一步,对已经通过变换和量化处理过的数据进行进一步压缩,从而提高整体编码效率。

  7. 兼容性和标准化: 熵编码方法如哈夫曼编码、算术编码等已经被广泛地集成到视频编码标准中,如H.264、H.265、VP9等,这些标准确保了不同编码器和解码器之间的兼容性。

  8. 优化编码性能: 熵编码可以与其他视频编码技术(如帧内预测、帧间预测、变换和量化)相结合,共同优化编码性能。

  9. 灵活性和扩展性: 熵编码方法可以根据新的压缩需求和技术进步进行调整和扩展,以实现更高的压缩效率。

  10. 减少计算复杂度: 相比其他一些压缩技术,熵编码方法通常具有较低的计算复杂度,这使得它适合于实时视频编码和解码应用。

综上所述,熵编码方法在视频编码中的应用可以显著提高压缩效率,降低存储和传输成本,同时保持数据的无损性,这些优势使其成为视频编码中不可或缺的一部分。

1.2 那么多熵编码算法,为什么选择哥伦布编码?

哥伦布编码(Golomb coding)是一种熵编码方法,它与一些其他类型的编码方法有相似之处,尤其是在它们都是变长编码(Variable-Length Coding, VLC)这一点上。但是同类型的编码算法那么多,为什么视频编码中选择使用哥伦布编码而不是其他编码算法呢?

主要是因为哥伦布编码具有以下几个关键优势:

  • 与信源无关:哥伦布编码的编码规则与信源的概率分布无关,这意味着它适用于各种类型的数据流,而不需要针对特定信源调整编码规则。
  • 无需额外信息:使用哥伦布编码时,不需要携带额外的码表信息,这简化了编码过程并减少了必要的数据传输量。
  • 压缩效率:尽管哥伦布编码的压缩率可能不如霍夫曼编码等算法,但在实际的视频编码应用中,它提供了足够的压缩效率,同时保持了较低的计算复杂度。
  • 编码复杂度低:与霍夫曼编码相比,哥伦布编码的运算复杂度较低,这使得它更适合于需要处理大量数据的视频编码场景。
  • 适应性:哥伦布编码能够适应视频数据中的不同统计特性,尤其是在编码变换系数时,可以有效地处理视频数据中的稀疏性。
  • 容错性:哥伦布编码的结构有助于在不完美或有噪声的传输环境中保持较好的容错性,这对于视频流的稳定性至关重要。
  • 广泛应用于视频编码标准:哥伦布编码被广泛应用于多个视频编码标准中,如H.264,这表明它在实际应用中已被证明是有效的。
  • 易于实现:哥伦布编码的实现相对简单,易于在硬件和软件中部署,这对于降低编解码器的开发和维护成本非常重要。

综上所述,哥伦布编码因其简单性、适应性、以及在视频编码中的高效性,成为视频编码领域中一个受欢迎的选择。

2 什么是哥伦布编码?

视频编码中的哥伦布编码是一种用于压缩数据的熵编码技术,它特别适合于编码那些具有几何分布特性的数值,比如在视频编码中常见的变换系数。哥伦布编码能够有效地表示这种类型的数据,因为它可以为频繁出现的较小数值分配较短的编码,而不常见的较大数值则分配较长的编码。

哥伦布编码的基本思想是将每个待编码的非负整数转换为一个较短的二进制表示形式。这种转换基于一个简单的观察:在许多自然信号中,较小的数值出现的频率远高于较大的数值。

2.1 形象解读哥伦布编码

想象一下,你管理着一个巨大的图书馆,这个图书馆的书籍数量非常庞大,而且种类繁多。每本书都有一个唯一的编码,用于标识和检索。在这个图书馆中,有些书籍非常受欢迎,借阅的频率很高(相当于小数值),而有些书籍则很少被人问津(相当于大数值)。为了简化编码系统并节省空间,你决定使用一种特殊的编码规则,这就是类似于哥伦布编码的系统:

  1. 编号调整:首先,你决定对每本书的编号进行加1处理,因为图书馆中没有编号为0的书。
  2. 二进制转换:接着,你将每本书的编号转换为二进制形式。
  3. 寻找最长的0前缀:在二进制编号中,你从最高位开始寻找第一个1的位置,1前面的所有0构成了一个序列。
  4. 编码生成:在找到的1前面,你添加相同数量的0,然后紧跟着是1后面所有的二进制位,这样就形成了这本书的哥伦布编码。
  5. 编码优势:这种编码方式的好处在于,那些编号较小(即受欢迎的)书籍的编码会很短,因为它们的二进制表示中1出现得很快,不需要太多0前缀。而不那么受欢迎的书籍,虽然编号较大,但它们的编码也不会太长,因为它们本来就不常被借阅。
  6. 解码过程:当需要找到一本书时,你从编码的第一个位开始向左数,直到遇到第一个1,然后根据1前面的0的数量确定书籍的编号,从而快速检索到书籍。

通过这个比喻,我们可以看到哥伦布编码如何为不同频率出现的数值提供一种高效的编码方式,这与图书馆中根据书籍的受欢迎程度来优化编码和检索系统非常相似。

2.2 0阶无符号指数哥伦布编码

正常来说,哥伦布编码可以拓展位k阶,但是在H264中使用的是0阶指数哥伦布编码,在H.264中使用ue(v)表示0阶无符号指数哥伦布编码的解码过程,用se(v)表示0阶有符号指数哥伦布编码过程。0阶无符号指数哥伦布编码最后生成的比特串格式为"前缀1后缀",前缀和后缀的长度是相同的。假如待编码数字codeNum = 5,0阶无符号指数哥伦布编码的步骤如下:

  1. 将数字5以二进制写出,5的二进制为101,因为0阶指数哥伦布编码,所以不用去掉低位。
  2. 将上面的二进制+1,101加1为110,留下的比特数为3,3-1=2,所有需要增加前导0的个数为2
  3. 因为第一步没有去掉,所有这一步不进行任何操作,最终生成的比特串为00110

通过这种方式,哥伦布编码能够为视频编码中的变换系数提供一种高效的编码方式,从而减少视频数据的总体大小,实现高效视频压缩。下面是对其他不同codeNum进行编码的结果,如下所示:

最后,总结下哥伦布编码的具体步骤:

  1. 加1操作:首先,将待编码的数值加1。这是因为哥伦布编码需要处理非负整数,而0作为一个特殊值,通过加1操作可以避免在编码中单独处理。

  2. 二进制表示:将加1后的数值转换为二进制形式。

  3. 寻找最长的0前缀:在二进制表示中,从最高位(最左边)开始数,找到第一个1的位置,1前面所有的0就构成了最长的0前缀。

  4. 编码生成:在1的前面添加与0前缀长度相等的0,然后在1后面放置原始二进制表示中1后面的所有位,这样就形成了哥伦布编码。

  5. 解码过程:解码时,从编码的第一位开始向左数,直到遇到第一个1,1前面的0的数量就是编码的长度。然后根据这个长度,从1后面读取相应数量的位,还原为原始数值。

2.3 扩展知识:k阶无符号指数哥伦布编码

k阶无符号指数哥伦布编码步骤如下所示:

(1)将codeNum加上2^k,k-0时是1;k=1时是2;k=2时是4;

(2)将codeNum加上2^k的数字用二进制表示;

(3)计算二进制长度len,然后在其前面加上前缀 len-1-k个0;

比特串的格式位"前缀1后缀"。前缀 = 后缀 - k,下面是对其他不同codeNum进行k阶无符号指数哥伦布编码的结果,如下所示:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言典型例题28

《C程序设计教程(第四版)——谭浩强》 习题2.5 输入一个华氏温度,要求输出摄氏温度。公式为C5/9(F-32),要求输出要有文字说明,取两位小数 数学知识: (1)华氏温度与摄氏温度&#x…

E2000 RGMII0通讯异常问题总结

最近让新来小朋友做了一款E2000Q的板卡,使用了E2000Q上的两个RGMII资源,外接YT8521转出了电口。 但是他调试中遇到了一个比较奇怪的问题,两套YT8521的电路都一样,但是一路通一路不通。 也就是框图中MAC2(芯片RGMII0,系统对应eth1)那路网络不通,图中MAC3(芯片RGMII1,…

DITA发布PDF样式定制

- 1 - 概述 使用结构化写作/DITA写作,内容和样式是分离的。 编写的内容放在DITA文件中,样式是放在样式模板文件中。 而且针对不同的格式的输出(如:PDF,MS Word),样式模板文件不同。 文档工程…

【优秀python案例】基于百度贴吧的数据采集与文本分析设计与实现

数据采集实现: 对百度贴吧帖子数据的采集。首先,使用requests库发送HTTP请求,通过设置请求头模拟浏览器访问,获取网页的HTML内容。然后,利用BeautifulSoup库对HTML内容进行解析,以便提取所需的信息。 在循…

c# .net core项目角色授权机制

前言 角色授权机制是确保应用程序安全性的重要组成部分,它允许开发者根据用户的角色来限制对应用程序中不同资源的访问。 基本概念: 角色授权基于用户角色的访问控制,即根据用户所属的角色来决定其能够访问的资源或执行的操作。在.NET Cor…

k8s—ingress应用

一、ingress和ingress-controller ingress对象: 指的是k8s中的⼀个api对象/资源对象,⼀般⽤yaml配置。作⽤是定义请求如何转发到service的规则,可以理解为配置模板。 ingress-controller: 具体实现反向代理及负载均衡的程序&…

鸿蒙第三方应用.hap打包、安装流程。

最近在华为手表上安装第三方应用(源码打包构建应用,需要签名)。网上看了教程,在此记录下。 准备工作:先安装DevEco Studio开发工具。 进入华为 appgallery connect网站(注册、开发者实名认证) …

【Material-UI】按钮组:按钮变体详解

文章目录 一、按钮变体概述1. 组件介绍2. 基本用法 二、按钮变体详细说明1. 轮廓按钮(Outlined)2. 文本按钮(Text)3. 填充按钮(Contained) 三、按钮变体的实际应用场景1. 界面设计2. 界面一致性3. 视觉层次…

面试笔记 8.5

面试常见: Jvm,高并发,多线程,数据库,redis,框架 1.N I/O有什么核心组件 Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客 Buffer 缓冲 Channel 一对一 Channel 读取数据 Selector对应线程…

双轮驱动产品持续商业成功

获取完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取,请见下图

前端(五):前端工程化

前端工程化是指在企业级的前端开发项目中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。 一、环境准备 (一)环境准备 1、Vue-cli:是Vue官方提供的一个脚手架,用于快速生成一个Vue的项目模板。 2、…

myeclipse 2020 下载 安装 汉化

1,解压 myeclipse 2020 压缩包到当前目录下: 点击此处蓝色字体下载压缩包 提取码 k3x9 2,鼠标右键 点击 myeclipse 2020.exe 选择 以管理员身份运行 : 3,等待加载: 4,点击 Next : 5…

正则表达式测试工具

前言 正则表达式测试工具可供您输入正则表达式和测试文本,立即查看匹配结果. 下面是离线的HTML文件,同样可以提供相同的服务. 目录 使用说明 HTML代码 正则表达式的编写经验和方法 总结 使用说明 1.先将HTML代码存储成.html为后缀的文件; 2.然后用浏览器打开这个…

C++空指针(nullptr)

C空指针(nullptr) ​ 在C语言中我们把空指针定义成NULL,但是这在C中会有所问题,因为C对指针类型转换比较严格。下面让我来深入了解一下NULL与nullptr。 NULL实际就是一个宏,在C头文件(stddef.h)中,可以看到如下代码:…

【ML】transform 之 decoder 及其实现细节

【ML】transform 之 decoder 及其实现细节 1. decoder2. encoder 和decoder 之间是如何处理和传递讯息的?self-attention3. 查询(Query)、键(Key)、值(Value)是三个核心概念及其具体含义和计算方…

二十八、【人工智能】【机器学习】- 隐马尔可夫模型 (Hidden Markov Models, HMMs)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

模型 MBTI(性格模型)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。探索真我,和谐人际。 1 MBTI性格模型的应用 1.1 跨国公司团队协作改进 ABC公司是一家全球性的科技公司,其研发团队由来自世界各地的工程师和设计师组成。尽管团队成员个个才华…

【Linux操作系统】关于深度睡眠与浅度睡眠进程的理解

目录 一、可中断的睡眠状态(S浅度睡眠状态)二、不可中断的睡眠状态(D深度睡眠状态)三、关于S浅度睡眠状态与D深度睡眠状态的理解 一、可中断的睡眠状态(S浅度睡眠状态) S(sleeping)…

【docker】docker和镜像仓库

阿里云镜像仓库(Aliyun Container Registry)是阿里云提供的容器镜像存储和管理服务。它以Docker Registry协议为基础,为容器开发者提供了稳定可靠的镜像存储和分发服务。 使用阿里云镜像仓库,您可以将自己的Docker镜像推送到阿里…

sqliabs靶场练习

关卡 熟悉Mqsql相关命令Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10 熟悉Mqsql相关命令 首先先熟悉一下Mysql的相关命令,可能在SQL注入的时候会用到。 1.查询服务器主机信息 HOSTNAME 主机名称 datadir——数据库路径 version_compile_os—…