当前位置: 首页 > news >正文

图像压缩编码(4)--H.26x系列视频压缩编码_2

目录

H.261 视频编码标准

H.261的编码与解码

1) 帧内/帧间编码

2)运动补偿

3)量化

4)环路滤波器

5)缓存器

压缩数据的分层

数据复用结构

H.264的编码与解码


H.261 视频编码标准

实际应用时,要求有强实时性、同步性以及最小的延迟时间。

编解码原理框图:

H.261的编码与解码

H.261 标准的编解码器原理框图如上图4-7所示。由于视频解码过程是其编码的逆过程,不同之处仅在于不需要做运动估计,运动矢量和其他所需信息直接从 VLC解码器得到,因此这里主要介绍 H.261 编码过程。

H.261 编码器的核心是采用运动补偿的帧间预测、二维 DCT、量化和可变长编码 VLC 的混合编码算法,其中,二维 DCT 以一个块(B)为基本单元。

1) 帧内/帧间编码

在H.261 编码过程中,不仅采用帧内编码模式,同时还采用帧间编码模式。

帧内和帧间模式的选择由编码控制电路自动控制。为了自动决定输入宏块MB 应采用帧内还是帧间编码,需要先找到判据,将前帧图像存储在存储器内,后一帧图像来到时,比较前后两帧图像的相关性,若相关性强则采用帧间编码,相关性弱,则采用帧内编码。这里的判据是以宏块为单位进行的。
第一帧要进行帧内编码,这一帧称为帧内帧(Intraframe),用I表示,之后可传送P帧、B帧。P帧是用它前面的I帧作为参考帧经过前向预测编码得到的,它也可以作为下一个P帧的参考帧。B 帧是用邻近的I帧(或P帧)、P帧为参考帧经双向预测所得。通常情况下,每12 帧或15帧图像中传送一帧I帧,每3帧或4帧图像中传送一帧P帧。每次场景更换时,第一帧为I 帧。

由于相邻帧具有很强的相关性,H.261允许每两个参考帧之间传送3个B帧。若参考帧为I帧、P帧,则:计算第一个B帧时,可用公式B=3xI/4 + 1xP/4;计算第二个B帧时,用公式 B=(I+P)/2;计算第三个B帧时,用公式 B=1×1/4+3xP/4。

输入图像信号为CIF 或QCIF 格式,8x8像素一块(B)。进行帧间编码时,当前图像块与预测图像块相减,得到预测差值,同时要产生预测帧。差值信号进行 DCT 变换,变换前每个B为8×8=64个8比特像素值,变换后得到64个 DCT 系数值,代表不同空间频率分量的幅度。在对 DCT 系数进行量化(Q)并取整后,采用 zigzag字形扫描将块内数据排列成一维数据串,进行游程长度编码,得到符号组序列,再对符号组进行可变长编码(VLC)。

量化后的 DCT 系数须经过反量化IQ 和IDCT 处理,形成重建帧并存入帧存储器,再经过运动补偿和滤波后产生预测帧.

2)运动补偿

运动补偿可使预测误差达到最小。

运动估计是以宏块为单位的,通过块匹配搜索得到运动矢量。运动矢量在用于构建预测帧的同时被送到 VLC编码输出,供解码用。
通常,运动估计只针对亮度信号进行,所得的运动矢量既用于亮度信号也用于色度信号,只是在用于色度信号时需要将运动矢量减半。


3)量化

在H.261 标准中,量化采用了32个线性量化器。其中,1个专门用于DC 系数,其量化步长为8;其余31个用于 AC 系数,量化步长分别为2,4,,62,具体选择哪一个由码率控制器决定。除DC 系数外,一个宏块(MB)中使用同一个量化器。
和JPEG标准一样,量化后的 DCT 系数也将经 Zigzag 扫描后送入可变长编码器 VLC进行二维游程长度编码。


4)环路滤波器

环路滤波器是一个二维空间低通滤波器,用于消除高频杂波,即消除边缘赝像。这是因为在帧间编码时,运动补偿过程仅仅是一个逼近过程,对高频分量匹配比较差,容易产生高频杂波。环路滤波器只有在检测到非零运动矢量时才切入,且以宏块为单位进行切入、切出。

5)缓存器

数据编码过程产生的码率不是恒定的,而是随着每帧图像的编码类型和图像内容的统计特性变化的。但传输网络中数据的码率必须恒定,因此在编码器的输出端必须用缓存器来平滑输出的数据率。
为避免发生缓存器溢出的情况,需要一个缓存器码率控制器来控制其输入码率。实际工作时,码率控制器根据缓存器的数据占有率控制量化器的量化步长,即当缓存器占有率高(即将被占满)时增大量化步长,缓存器占有率低(即将为空)时减小量化步长,从而调节输入到缓存器的码率。

压缩数据的分层

为了有秩序地传输每帧图像的数据,并有利于图像数据交换和设备兼容,把一帧图像数据分成4层:帧、块组(Group Of Block,GOB)、宏块 MB 和数据块B。

最小处理单元为8x8 像素块(B),然后按4:2:0的比例对亮度和色度块进行抽样,组成一个宏块(MB macro block);一定数量的 MB 构成块组GOB,片?:若干个 GOB构成一帧图像。

1)数据块 B
数据块是最小的块,由8x8个像素组成。亮度和色度均采用8x8的数据块作为基本编码单元。

2)宏块 MB
一个 MB 由6个数据块B组成,其中包括4个亮度块、2个覆盖同样面积但分辨率为其 1/4的色度块C_{b}块和C{_{r}}块,数据块的排列顺序如图4-8(a)所示。----4:2:0的比例-

3)块组 GOB

一个 GOB 包含33个宏块 MB,其中,横向11个,纵向3个。排列次序如图4-8(b)所示。

4)CIF 帧
1帧 CIF 图像由12个GOB 构成,排列次序如图4-8(c)所示。显然:

1GOB=12×33MB=396x[4(Y)+1(Cb)+1(Cr)] B =2376B

1GOB=2376×8x8=152064 像素
对于 QCIF 格式图像,由于它的像素数只有 CIF 格式的1/4,所以每帧 QCIF 图像只含有3个GOB,如图 4-8(d)所示。

(CIF:即视频会议中通用的影像传输格式。分辨率为352x288像素,图像传输速率可达每秒30帧,符合ITUH.261视频会议数据传输协议。)

数据复用结构

------------待补充

H.264的编码与解码

与H.261一样,H.264 编码器采用的仍是 变换+ 预测的混合编码法。如图所示,编码器有两条主要的数据流路径,一条是从左——> 右,完成编码;一条从右——> 左,完成重建。

 编码器以宏块为单位处理输入的帧或场F_{n},具体又分为帧内预测编码和帧间预测编码:
(1)在帧内编码模式中,其预测值 PRED(图中用P表示)由当前帧中的已编码宏块经解码、重构预测获得;
(2) 在帧间编码模式下,P由当前片中前面已编码的参考图像经运动补偿(MC)后得到,其中参考图像用F_{_n-1{}}表示。
将预测值 PRED 和当前块相减,即可得到一个残差块D_{n}, 经DCT 变换、量化后产生一组量化后的变换系数 X,再经熵编码,与解码所需的一些信息(如预测模式、量化参数、运动矢量等)一起组成一个压缩后的码流,进入网络提取层 NAL,供传输和存储用。
正如前面述,为了提供进一步预测用的参考图像,编码器必须有重建图像的功能。因此,先对残差图像进行反量化、DCT 逆变换以得到D_{n}{}',然后将D_{n}{}'与预测值 P 相加,得到uF{_{n}}{}'。为了去除编码解码环路中产生的噪声,提高参考帧的质量,进而提高压缩性能,这里设置了一个环路滤波器,滤波后的输出F{_{n}}',即为重建图像,可用作参考图像(如用于对F_{n+1}的编码)。


下图给出了H.264的解码过程。首先,解码器从网络提取层 NAL 接收压缩比特流。经过熵解码和重排序,得到量化后的系数X,然后进行反量化、DCT 逆变换生成残差宏块。
另一方面,解码器从码流中解析出头信息,利用这些头信息得到该残差宏块的预测宏块P。
考虑到该预测宏块 P与编码器的原始预测宏块P相同,这样,P与残差宏块相加即可得到重建块,再进行滤波即可得到最终的解码帧(重建帧)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • M9410A VXT PXI 矢量收发信机,300/600/1200MHz带宽
  • DPDK 简易应用开发之路 3:实现ping(ARP ICMP 协议)
  • vscode缩进 和自动格式化
  • MySQL表的内外连接
  • sqlserver创建表删除表
  • 库仑定律-库仑力-两个电荷之间静电力的计算公式
  • 计算机网络原理第二章
  • 全栈开发(二):springBoot3连接mysql数据库
  • PHP基础语法讲解
  • R包安装教程,如何安装rjags和infercnv
  • 苍穹外卖——day3
  • 双击热备 Electron网页客户端
  • k8s上安装prometheus
  • C++的哲学思想
  • Rust 文件与 IO
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • C语言笔记(第一章:C语言编程)
  • Mybatis初体验
  • SegmentFault 2015 Top Rank
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Tornado学习笔记(1)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 初识 webpack
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 聊聊sentinel的DegradeSlot
  • 深度学习入门:10门免费线上课程推荐
  • 什么软件可以剪辑音乐?
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 在Mac OS X上安装 Ruby运行环境
  • Java数据解析之JSON
  • 第二十章:异步和文件I/O.(二十三)
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #git 撤消对文件的更改
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (算法设计与分析)第一章算法概述-习题
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)基于IDEA的JAVA基础1
  • (转)3D模板阴影原理
  • (转)jQuery 基础
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .ai域名是什么后缀?
  • .NET CORE Aws S3 使用
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net FrameWork总结
  • .Net IE10 _doPostBack 未定义
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法