MPEG-1中I、B、P帧的基本编码原理

2024-03-07 16:59
文章标签 原理 基本 编码 mpeg

本文主要是介绍MPEG-1中I、B、P帧的基本编码原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上篇文章中,我们对MPEG-1有了一个轮廓性的介绍,知道视像序列中的图像类型有三种,分别为I帧、P帧、和B帧。但是我们并没有更深入的去了解,编码这三种类型的图像数据时所采用的不同方式,只知道它们都是把图像分为以16x16像素的宏块、8x8像素的图块为基本单元进行处理的。而实际上,编码I、P、B三种类型的图像数据的方式并不相同,不过在进一步展开之前,我们先来讲讲为什么要在这个时候讲这个。

我们都知道MPEG标准的制定,是一步一步来的,有了MPEG-1之后,才有MPEG-2、-4和H.264/AVC。而在这一步又一步的拓展和优化中,后者总是继承前者,并对前者的不足进行改善和加强。而对于MPEG-2也是这样,它的编码原理来自MPEG-1,而又在MPEG-1的基础上,做了一些加强。所以如果想要了解MPEG-2,就必须要对MPEG-1的编码原理,有个基本的认识。

我想这就是自底向上的本质,也是我们不谋而合,在这个系列所采取的方法。所以下面我们开始介绍I、B、P帧的基本编码原理,注意是基本,说明我们并不会深入去探讨某一个方法,如DCT变换、量化、DPCM、RLE、霍夫曼编码、算术编码。只需要掌握以下两点即可:

  • 1、对编码流程有一定的了解
  • 2、了解I、B、P帧三者编码的不同

1、I帧的基本编码原理

上篇说过,MPEG-1主要在时间冗余和空间冗余两个方向上,去除冗余数据。时间冗余是帧与帧之间产生的冗余数据,而空间冗余则是单帧图像中,相邻像素间产生的冗余数据。对于I帧来说,因为它是关键帧,既不需要参考过去的帧,也不需要参考将来的帧。所以对I帧的编码,是为了消除空间冗余数据,而且它采用的压缩算法,和JPEG类似。如下图:

在这里插入图片描述
I帧的压缩编码算法

从图中可以看到,如果图像是用RGB颜色空间表示的,则首先把它转换成用YCbCr空间表示的图像。然后每个图像平面分成8x8像素的图块,并对每个图块进行离散余弦变换(DCT)。

这里DCT的作用非常大,看它的名字可能会觉得非常高大上,其实它就是一个矩阵变换。关于它其实都可以专门写一篇文章出来,不过这里我们只需要知道它的作用即可。DCT简单点来说,它就是将前面8x8像素图块的颜色空间数据,分为高频数据和低频数据,所以我们也常说,DCT是把数据从空间域转换到频率域。

那什么是高频和低频呢?这里的高频数据是指,图像颜色的变化比较强烈的地方,比如人像画的轮廓与背景的交叉处,在这里的色值变化很快,所以称为高频。相对的低频就是指,颜色变化比较缓和的地方。所以DCT的作用并不是对数据进行压缩,而是为了方便后面的操作,比如量化、RLE行程编码、以及霍夫曼编码。

下一步就是量化,因为人眼对高频区域其实并不敏感,所以利用这一点,可以将高频部分数据进行压缩。这样一来,图块的数据就会呈现两部分,一部分是变化平滑的低频数据,另一部分是刚压缩过的高频部分,数值也变得差不多。而后再经过Zig-zig编排,数据就会呈现出连续几个值相同的的形式,比如23334551550000。这样一来,再经过RLE行程编码,就可以去掉连续值相同的冗余数据。

因为RLE在编码时,对相同的数值只编码一次,同时计算相同数值重复的次数,因此称为行程编码。而与RLE处于同级的DPCM,则主要是对图块与图块之间的差值进行编码。这样一来可以再次压缩数据,之后再通过霍夫曼编码或者算术编码,编码操作也就完成了。同样霍夫曼编码和算术编码,也可以单独写一篇文章出来。

2、P帧的基本编码原理

P帧也就是预测图像P,与I帧不同的是,它不仅要从空间上去除冗余数据,还要从时间冗余方面上着手,因为它是以在它之前出现的I帧作为参考对象来编码的。与I帧不同的是,预测图像P的编码是以16x16像素的宏块为基本编码单元的。对于P帧,为了表示它与前面I帧的关系,我们会一直用预测图像和参考图像这两个词。

其实很好想象,因为对预测图像编码,就是对它和参考图像直接的差值进行编码。所以我们只需要做到以下两点即可:

  • 1、算出当前要编码的图像宏块,与参考图像宏块之间的差值
  • 2、计算出宏块的移动矢量

比如下图:
在这里插入图片描述

这张图应该一目了然,时刻1中的人像,在时刻2移动到了图像右侧。这个过程中变化的,不只是人像的位置,因为人在移动的时候,会有其他的动作,比如低头、转头、仰头等动作。所以我们并不仅仅要计算出人像变化之后的位置,也就是移动矢量,还要计算出两个宏块之间的差值。

当然这两者在编码过程中,是有个先后关系的。比如我要计算出宏块的移动矢量,那我得找到参考图像中的宏块,在预测图像中的位置吧。而更进一步,那我怎么找到预测图像相对于参考图像中,图块的位置呢?答案是预测图像中的某个宏块,与参考图像中的这个宏块的差值最小,也即最佳匹配宏块。

这就引起了一系列的搜索算法,去预测图像中去找这个宏块,比如二维对数搜索法、三步搜索法、对偶搜索法。而对预测图像P的编码所引起的时间,则主要是执行这个搜索算法所占用的时间。

等找到最佳匹配宏块后,计算出差值和移动矢量,剩下的操作就和对I帧的编码一致了。

在这里插入图片描述
预测图像P的压缩编码算法

3、B帧的基本编码原理

B帧也是双向预测图像B,对它的编码,即是对它前后帧的像素值之差进行编码,具体的方法和对预测图像P的算法类似。

在这里插入图片描述
双向预测图像B的压缩编码算法

总结

从以上介绍就可以看出,I帧是对视频最重要的图像帧,P帧其次,B帧更次。所以B帧的压缩比也是最高的,P帧其次,I帧压缩比最小。在实际应用中,对于快速运动的图像,I帧的频率可以高一些,B帧的数目可以少一些。而对于慢速运动的图像,则相反。

这篇关于MPEG-1中I、B、P帧的基本编码原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784217

相关文章

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实