视频基础学习四——视频编码基础一(冗余信息)

文章目录


前言

上一篇文章介绍了视频帧率、码率、与分辨率。也介绍了为什么需要对视频进行压缩,因为720P、rgb24编码格式、25帧、1s的视频大小为
1280 ∗ 720 ∗ 3 / 1024 / 1024 ∗ 25 ∗ 1 = 65.75 M B 1280∗720∗3/1024/1024∗25∗1=65.75MB 1280∗720∗3/1024/1024∗25∗1=65.75MB

这无疑是很大的内存。

一、编码压缩的原理

视频编码就是为了去除视频帧之间大量的冗余信息,而视频图像中的冗余信息有以下几种:

  • 空间冗余:图像相邻像素之间有较强的相关性
  • 时间冗余:视频序列的相邻图像之间内容相似
  • 编码冗余:不同像素值出现的概率不同
  • 视觉冗余:人的视觉系统对某些细节不敏感
  • 知识冗余:规律性的结构可由先验知识和背景知识得到

压缩技术就是将这些冗余信息去掉,去除数据之间的相关性,包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技术

下面就以这张动态图来进行介绍这几种冗余

1.空间冗余

我们从这个图片中选中一块区域进行放大,提取像素点

可以看到,相邻像素点之间几乎全部一模一样,这个也就是空间上的相似性,空间信息的冗余。

那么如何进行压缩呢,这里就有一种办法叫做帧内预测

帧内预测

我们预测:在一帧当中,颜色在垂直方向上保持一致,这种预测意味着未知像素颜色与近邻像素相同,看下图

但是这种预测是错误的,因为该表单中,最右下角的像素颜色不是(255,255,51),而应该是(255,255,204),这个时候我们通过减去实际值,算出残差 ,这样的数据就更容易压缩

同样,我们可以通过这个残差预测距离这个残差相邻的数据是什么样的像素

2.时间冗余

时间冗余信息是发生在相邻帧之间的,比如下面一张图片。

这两张图片具有很大的相似,随着时间的改变,除了海绵宝宝动作在变,背景是一直都没有变化的。

在时间上就构成了像素的相关性,这个就是时间冗余,通过帧间预测的方法可以进行压缩这种冗余信息。

帧间预测

帧间预测是利用视频时域的相关性,使用邻近已编码图像像素预测当前图像的像素,以达到有效去除视频时域冗余的目的。

帧间预测具有两大内容:运动估计(运动搜索、亚像素插值和运动矢量)、运动补偿

运动估计

运动估计是以当前图像的像素块在之前已编码的图像中寻找到最佳的一个匹配块。从而提取到当前图片的运动信息。

比如以当前帧减去上一帧(参考帧),留下的残差就可以视为一个匹配块,当然实际上是远比这要复杂的,最直接的方法是为每个像素指定一个运动向量,但是这种基于像素的运动表示法 会有很高的数据量,为了降低这种复杂度,可以将图像分为不同大小的像素块,只有块大小选择合适,每个块的运动参数可以独立进行估计,这就是基于块的运动表示法

运动补偿

运动补偿:一种描述相邻帧(相邻在这里表示在编码关系上相邻,在播放顺序上两帧未必相邻)差别的方法,具体来说是描述前面一帧的每个小块怎样移动到当前帧中的某个位置去。

假使现在一个像素块在t时间坐标为x,t+1时间坐标在x+1,那么我们可以预测下一时间t+2该像素块在x+2位置。

3.编码冗余

这个纯纯是一种数据运算了,在视频基础学习二------图像深度与格式(RGB与YUV)这篇文章里面,曾介绍过YUV格式,也曾提到过YUV的出现可以大大减少编码存储内存,人眼对于Y分量也就是明度感知最为明显,对于UV分量反而不明显,所以就可以丢弃一些UV分量,而加大Y分量的数据,同时分析Y分量的频率进行压缩。

其中Y分量,也就是明度通过RGB进行转换为
Y = 0.299 R + 0.587 G + 0.114 B ; Y = 0.299R + 0.587G + 0.114B; Y=0.299R+0.587G+0.114B;

其中在编码中又把明度和RGB的关系进行了分级,叫做灰度级 ,通常分成了0~255个级别

那么灰度值怎么对于编码压缩提到了帮助呢?这里就用到的数学公式,有兴趣的可以看看博主这边从别的文章中进行摘录过来的

对于图像来说,可以假设一个离散随机变量表示图像的灰度级,并且每个灰度级(rk)出现的概率为pr

这里L是灰度级数,nk是第k个灰度级在图像中出现的次数, n是图像中的像素总数。如果用于表示每个rk值的比特数为 l(rk),則表达每个像素所需的平均比特数为:

就是说,将表示每个灰度级值所用的比特数和灰度级出现的概率相乘,将所得乘积相加后得到不同灰度级值的平均码字长度。如果某种编码的平均比特数越接近熵,則编码冗余越小。

4.视觉冗余

视觉冗余:人类的视觉系统由于受生理特性的限制,对于图像场的注意是非均匀的,人对细微的颜色差异感觉不明显。

上面说了人们对于一张图片的明度进行了分级,即灰度级,范围是0~255级,而人类的视觉一般分辨的能力只有26灰度等级,而一般的图像量化采用的是28灰度级。会存在视觉上的冗余,比如下面的图片

最左边的图显示了一张存在0~255种灰阶的图片,中间则是经过了量化为16种灰度级的图片,通过改进后,减少了假轮廓和颗粒后(IGS标准量化方法)生成的最右边的图像。

值得注意的是,这是一种不可逆的操作,必定会造成定量信息的损失

二、压缩编码的流程

综上所诉,编码器大概压缩过程和编解码器的流程就像下面两张图一样

1.编码器

代码如下(示例):

2.编解码流程


总结

其实这边文章并没有介绍实际编码应用中使用到的一些技术,而是偏向编码原理的一些知识,但是我个人还是认为知道这些知识还是非常有意义的,那么下一篇会介绍实际编码中的一些知识。

如果对您有所帮助,请帮忙点个赞吧!

相关推荐
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__4 小时前
Web APIs学习 (操作DOM BOM)
学习
darkdragonking5 小时前
FLV视频封装格式详解
音视频
数据的世界016 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐7 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
元争栈道7 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
元争栈道8 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
OopspoO9 小时前
qcow2镜像大小压缩
学习·性能优化
A懿轩A9 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒9 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin