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

文章目录

  • 前言
  • 一、编码压缩的原理
    • 1.空间冗余
      • 帧内预测
    • 2.时间冗余
      • 帧间预测
        • 运动估计
        • 运动补偿
    • 3.编码冗余
    • 4.视觉冗余
  • 二、压缩编码的流程
    • 1.编码器
    • 2.编解码流程
  • 总结


前言

上一篇文章介绍了视频帧率、码率、与分辨率。也介绍了为什么需要对视频进行压缩,因为720P、rgb24编码格式、25帧、1s的视频大小为
1280 ∗ 720 ∗ 3 / 1024 / 1024 ∗ 25 ∗ 1 = 65.75 M B 1280∗720∗3/1024/1024∗25∗1=65.75MB 12807203/1024/1024251=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.编解码流程

在这里插入图片描述


总结

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

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

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

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

相关文章

C++的并发世界(四)——线程传参

1.全局函数作为传参入口 #include <iostream> #include <thread> #include <string>void ThreadMain(int p1,float p2,std::string str) {std::cout << "p1:" << p1 << std::endl;std::cout << "p2:" <<…

ElementUI 表格横向滚动条时滚动到指定位置

ElementUI 表格横向滚动条时滚动到指定位置 getColumnOffset(columnProp) {this.$nextTick(() > {const table this.$refs.tableRef.$refs.multipleTable;const columns table.columns;const column columns.find((col) > col.property columnProp);if (column) {// …

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一&#xff0c;引言 在云计算时代&#xff0c;随着开发者逐步将应用迁移至云端以减轻硬件管理负担&#xff0c;软件配置与环境一致性问题日益凸显。Docker的横空出世&#xff0c;恰好为软件开发者带来了全新的解决方案&#xff0c;它革新了软件的打包、分发和管理方式&#xff…

spark3.x新特性

Adaptive Query Execution自适应查询(SparkSQL) 由于缺乏或者不准确的数据统计信息&#xff08;元数据&#xff09;和对成本的错误估算&#xff08;执行计划调度&#xff09;导致生成的初始执行计划不理想 在Spark3.x版本提供Adaptive Query Execution自适应查询技术 通过在”…

redis集合Set

set是一种无序集合。它和列表的区别在于列表中的元素都是可以重复的&#xff0c;而set中的元素是不能重复的。而且set中的元素&#xff0c;并不像列表那样是具有顺序的。 SADD是添加一个元素。course是集合。 SMEMBERS SISMEMBER判断Redis在不在集合course里 SREM是用来删除Re…

VSCode美化

今天有空收拾了一下VSCode&#xff0c;页面如下&#xff0c;个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多&#xff0c;有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网&#xff1a;Maple-Font 我只安装了下图两个字体&#xff0c;使…

C++算法补充---STL

这里写目录标题 CSTL容器字符串函数(string容器函数)字符串转字符 算法交换函数拿到容器或者数组的第一个最大&#xff08;小&#xff09;值元素的下标或者值排序函数求字符数组的有效长度atoi函数&#xff08;将字符串类型的数字转为真正的int型数字&#xff09;string转字符 …

RUST Rover 条件编译 异常处理

按官方处理发现异常 会报异常 error: failed to parse manifest at C:\Users\topma\RustroverProjects\untitled2\Cargo.toml 修改模式如下才能正常编译 网上说明 这样处理 [features] print-a [] print-b [] full ["print-a","print-b"]

Vue3组件计算属性的缓存

Vue.js3组件的方法-CSDN博客 使用Vue3组件的计算属性-CSDN博客 Vue3组件计算属性的get和set方法-CSDN博客 计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时&#xff0c;才会重新求值。 计算属性的写法和方法很相似&#xff0c;完全可以在method…

鸿蒙OS元服务开发:【(Stage模型)学习窗口沉浸式能力】

一、体验窗口沉浸式能力说明 在看视频、玩游戏等场景下&#xff0c;用户往往希望隐藏状态栏、导航栏等不必要的系统窗口&#xff0c;从而获得更佳的沉浸式体验。此时可以借助窗口沉浸式能力&#xff08;窗口沉浸式能力都是针对应用主窗口而言的&#xff09;&#xff0c;达到预…

第五篇:3.4 用户归因和受众(User attribution and audience) - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability&#xff09;第四篇广…

Apache Paimon实时数据糊介绍

Apache Paimon 是一种湖格式,可以使用 Flink 和 Spark 构建实时 数据糊 架构,用于流式和批处理操作。Paimon 创新地将湖格式和 LSM(日志结构合并树)结构相结合,将实时流式更新引入湖架构中。 Paimon 提供以下核心功能: 实时更新: 主键表支持大规模更新的写入,具有非常…