zoukankan      html  css  js  c++  java
  • 4,视频压缩的基本原理,一些常见压缩算法的概念

    自己的这个笔记,废了好久,还是要坚持写下去,虽然现在看来,质量不太高,而且很多东西貌似没有说到位,只有自己才看得懂,明显不是技术普及的方式。

    先说基本原理,这个基本就是抄书了,因为不是做科研的,很多东西都是人们用了很多年才逐渐总结出来的。

    对于算法研究而言,本身就是要先知道哪个地方可以努力,哪些地方行不通。这些原理,就是指明方向的。

    一.视频压缩的可行性

    1.空间冗余

    一幅静态图像,比如人脸。背景,人脸,头发等处的亮度,颜色,都是平缓变化的。相邻的像素和色度信号值比较接近。具有强相关性,如果直接用采样数来表示亮度和色度信息,数据中存在较多的空间冗余。如果先去除冗余数据再编码,表示每个像素的平均比特数就会下降,这就是通常说的图像的帧内编码,即以减少空间冗余进行数据压缩。

    2.时间冗余

    视频是时间轴方向的帧图像序列,相邻帧图像的相关性也很强。通常用降低帧间的方法来减少时间冗余。采用运动估计和运动补偿的技术满足解码重建图像的质量要求。

    3.符号冗余

    用相同码表示概率不同的符号,会造成比特数的浪费。比如10,11,13三个数,如果我们都用1bytes来表示,就是3bytes(即3×8 = 24bits),但是如果我们表00b表示10,01b表示11,02b表示13,这样,三个数合起来才用了6bits,较之前可以节省18bits。

    可变长编码技术的原理就如此,概论大的用较短的码字,概率小的用较长的码字。

    4.结构冗余

    对于图像内部,各个部分也存在某种关系。我们可以通过这种关系,减少信息的码字表达。比如:分形图像编码

    5.视觉冗余

    1),人眼对彩色信号的亮度分辨率高于色彩分辨率,比如rgb-->yuv就是这个原理

    2),人眼对静止图像的空间的分辨率大于运动图像的分辨率。

    3),人眼对亮度的细小变化不敏感

    4),中心敏感,四周不敏感。

    其实我们虽然知道了这些,我们知道有冗余,但是如何把这些冗余找出来,是个很复杂的过程。也是我们的算法不断追求的过程。

    上面的一段,是所有视频压缩标准的基石。mpeg2,mpeg4,h264,h265这些标准,与其说他们是标准,不如他们提供了一些算法的组合,或简单或复杂,当然简单的算法压缩掉的冗余小,复杂的压缩掉的冗余大。通过算法找到冗余信息在哪,然后压缩掉,实现数据量的减小。这就是我们的目录。

    更近一步的说,就是我们如何找出数据的相关性

    二,常见算法的名词解释

    大的分类有两种,一个变换,一个是编码。

    先说变换

    我们要找出信号的相关性,时间上不好找怎么办,变换到另外一个空间上去。这就是我们在信号与系统,数字信号处理,高等数学得到的结论

    变换

    傅里叶变换

    walsh-hadamard(沃尔什哈达玛变换)

    正弦变换

    余弦变换----应用最广

    斜变换

    哈尔变换

    k-L变换

    小波变换

    对于这些变换来说,很多东西只在数学上有意义,对于工程来说,或者没有快速算法,或者变换后相关性比较低,或者其他原因。只有余弦变换是最最广泛的,为了减小我们的学习压力(当然如果你是要对比其中的差异的另当别论),我们只掌握余弦变换就可以了。

    编码

    又分无失真编码与限失真编码,从名字上我们就可以看出差异了。呵呵,不多解释

    无失真编码的种类:

    哈夫曼编码,算术编码,游程编码

    限失真编码

    预测编码,变换编码,矢量量化,基于模型的编码。

    对于编码这块,上述的算法,基本要全部掌握才行。

    jpeg/mpeg2先用了游程编码减小的0这个数占用的比特位,然后用了哈夫曼压缩。

    h264用了算术编码来做最后一道压缩工序

    运动补偿与运动估计,用到预测编码。

    mpeg4用到了基于模型的编码

    变换完成后,进行了矢量量化。

  • 相关阅读:
    oracle分页查询sql写法
    查询一张表的id,不在另外一张表的某个字段的数据
    PowerDesigner 使用详解
    java JUC多线程高并发编程
    npm node-sass安装失败解决方法
    Vue中展示二级路由的默认模块 若依框架 自定义指令权限的使用说明
    vue 2.6以后slot 的变化使用
    java中 List<? extends T>与List<? super T> 表示的意思和区别
    java springboot自定义注解 和 时间加一天 一个月 一年方式
    js中||与&&的用法以及every()与some()的用法
  • 原文地址:https://www.cnblogs.com/mr-nop/p/3302379.html
Copyright © 2011-2022 走看看