Home - baidut/co-codec GitHub Wiki

Welcome to the co-codec wiki!

Contents

CODEC 
  ├─ Source CODEC
  │  ├─ File  Data CODEC
  │  ├─ Audio Data CODEC
  │  ├─ Image Data CODEC
  │  ├─ Video Data CODEC
  │  └─ Other Data CODEC
  │ 
  └─ Channel CODEC
     ├─ Error Detection  CODEC
     └─ Error correction CODEC

Source CODEC Data compression ──> take the source data and make it smaller.

Channel CODEC Error correction ──> transmit quickly, contain many valid code words and can correct or at least detect many errors.

编码主要用于通信领域。我们都玩过击鼓传音的游戏,下面以此作类比介绍通信中的编码技术:

  • 游戏以传信的快和准作为评价指标,所以编码的目的就是信息从信源到信宿传输更快更准;
  • 第一个传话的人需要提炼有用信息,否则传输效率低,所以需要信源编码;
  • 传话的人需要添加一些冗余的信息解释,防止产生误解,否则出现错误后以讹传讹,最后一个人就得不到正确的信息。所以需要信道编码,对可能出现的错误进行校验和恢复。

编码就是一种变形,将信息转换成一种可以高效传输的形式。

另外,除了传输方面,编码技术也使得信息能够高效地存储。所谓高存储性能即能够存储更多的信息以及能够有效读出信息。 首先需要对原始文件进行编码,去除其中的冗余信息,这里就用到了信源编码技术;其次需要追加冗余信息以提高信息的稳定性,如磁盘冗余阵列的引入,这里用到了一些信道编码的技术。

编辑图片

Source CODEC

压缩技术有没有意义? 有人说如果传输带宽足够大,机器存储能力也足够大,则压缩技术就没有意义或者意义不大了。 那么压缩技术带来的好处是否会随着科技发展而减弱呢?

我认为随着信息量需求的不断增大,以一种新的更有效的形式存储信息是很有必要的,我认为压缩技术会演化成为信息的处理高效化技术,而呈现信息时将信息的处理高效形态解压,得到原始信息不重要部分弱化的相似信息。

压缩和解压缩 压缩可以按照编码变换和反变换来理解。 把编码的信息转为以另一种占据空间更小的编码的信息来传输或存储,这个过程叫做编码;大的成小的 使用时还原成原来的编码,这个过程叫做解码,解码后得到原始信息,则采用了无损压缩技术,如果得到了原始信息的近似呈现,则采用了有损压缩技术。

有损压缩 这个例子可能有些广义,与实际技术不太贴切

┌ 1     0.1    0       0   ┐                     ┌ 1 0 0 0 ┐
| 0     1      0       0   |                     | 0 1 0 0 |     
| 0     0      1.2     0   |   ->  4阶单位阵 ->   | 0 0 1 0 |
└ 0     0      0       1.3 ┘                     └ 0 0 0 1 ┘

压缩技术

量化 56.8 34.2 67.3... -> 57 34 67... ->57.0 34.0 67.0... 以一串一位小数为例,如果对它们四舍五入,就可以得到近似值,再通过加一位小数还原,这是一种有损的压缩,精度变差了。 如果上面的这串数每个都是一个向量的某个不重要的分量,那么最后的近似效果就是有意义的,对不重要的数据牺牲精度换取空间。 图像上每个点的各个参数作为一个向量表示,如果上面这串数字是向量中的不重要的分量,我们的处理就做到了图像压缩; 对于视频中的点也可以量化处理,但是没有利用视频在时间上的相关性,即视频相邻两帧图像的相似性。

帧间残差 678 679 670 673... -> 678 +1 -9 +3... -> 678 679 670 673... 如果相邻的两个数比较相近,则可以采用存储它们的差(感觉像是记录位移)来进行压缩。 视频中相邻两帧的差别比第二帧较小,把 第一帧+第二帧 压缩为 第一帧+帧间残差 就能得到更小的体积。 两个图像矩阵相减,相同的地方成为0,残差图像的能量明显更小。 残差图像可以看做是图像的位移,这种压缩可以理解为转为初始位置和位移的形式编码

熵编码 前面的量化和帧间残差都可能得到稀疏矩阵(除和减得0),如果进一步对稀疏矩阵进行压缩编码,就可以进一步地减小体积。

猜想--面向对象的压缩技术 (基于对象的编码技术已经出现) 视频和图像压缩技术中人的主观因素虽然是难以评定的,但可以利用这一点进行对人友好的压缩。我猜想可以通过智能解析图像的内容主体进行细致呈现而对非主体进行压缩可以得到更好的人的主观视觉效果。同样对视频的面向对象分析也值得研究。 视频 -> 计算机编写的小说 -> 视频

各级冗余

  • 空间冗余
  • 时间冗余
  • 统计冗余
  • 其他
    • 结构冗余 纹理特性
    • 知识冗余 熟悉的先验知识,如眼部结构
    • 视觉冗余 视觉不敏感

要对信息进行压缩,就要发掘信息中的冗余,主要是利用信息的相关性。

由于信息的结构特征,所以存在多维度的冗余,可以通过降维将冗余一层一层的去掉

  • 零维的冗余如统计冗余,它没有利用数据的先后顺序规律,而是利用信息的元素分布规律。字典压缩法对元素以字典索引的形式存储,可以理解为每输入一个单词就输出一个和当前字典不冲突的缩写(前缀码),输出端通过查字典的方式进行解码还原。变长编码法利用元素的出现概率的不匀衡性,对经常出现的元素分配短的码字,而对不常出现的元素分配长的码字,可以理解为对越常用的单词设计得越短,越少用的单词设计得越长,输出端也是通过查字典的方式还原。
  • 一维的冗余是利用数据和其前后出现的数据之间的关联,如游程编码可以有效地压缩元素组序列(就像游行一样,元素后跟着若干相同元素,一个元素组又一个元素组方式的数据),再如对渐变的数据的差值编码(678 679 670 673... -> 678 +1 -9 +3... )再如视频压缩中的时间冗余,就是在时间维度上图像数据的相关性。
  • 二维的冗余如空间冗余,利用元素与其上下左右的邻居之间的相关性。如图像处理中的DCT变换将图像矩阵的能量分布集中到了左上方,去除了他们之间的频域相关性,在对DCT矩阵采用zig-zag扫描将二维转为一维,利用一维冗余的消除办法进行编码。DCT变换提取出了图像矩阵块的主要直流分量,叫做DC系数,一副图像中的DC系数矩阵仍保留着图像空间上的相似性,因此降维后可以采用差值编码;而在图像块内部,除了直流分量外的其他交流分量,叫做AC系数,由于存在很多连续的若干个0,降维后可以采用游程编码进行压缩。

有的信息维是可以有损失或者直接去除的

  • 感知冗余是针对获取信息的对象进行的,如果某些信息对于其对象来说不重要或者不敏感或者不感兴趣,则可以认为是冗余的,如色彩空间的冗余(不敏感)和视觉冗余(不感兴趣)。
  • 知识冗余是指那些世人皆知的部分,这些信息为必然事件,信息量为0,是冗余的,比如英语的语法的单三规则可以认为是冗余的,编码端可以去掉由于单三规则需要添加的s,而在解码端根据此通识知识还原s。

要想发掘更多的冗余,就要找到更多的相关性,除了前面提到的冗余外,还可以从下面几个角度挖掘相关:

  • 色彩空间相关(注意和前面的感知冗余不同),彩色图片不论是按照RGB划分,还是按照YUV划分,不同分量构成的分图之间都存有很大的相似性,如边缘特征,如果能够利用这些特征而不是针对各个色彩空间独立地进行压缩,就能得到更高的压缩率。参考Chroma from Luma

同时,为了实现并行以提高编解码速度,又要使得处理过程尽量的不相关。

相关性给压缩带来了可能

预估和接近

高频和低频 高频的可能是噪声

低频 稳定的直流分量

另一组基, 小波变换

1 Fast 变换步 无损 FFT 快速傅里叶变换 FWT 快速小波变换
2 Few is enough 少量基向量就能逼近原始信号, 为良好的压缩性能提供可能

压缩相关公开课

ZCC,ZCV技术细节   如何把“零”损耗和高压缩这两个看似矛盾的方向统一起来,就在于张春成的“独特算法”。以一张白底照片为例,“这一片都是白色,我可以把这些白色的点统一描述成一个数据,那么这些以前要用几万个字节描述的点,我只用几十个字节就描述清楚了,文件自然缩小。”   ZCC技术在图像压缩处理中,将待压缩图象按频率高低分成若干子图象,根据在分析彩色图象色彩三分量(红、绿、蓝)的相关性各个图象包含编码的多少将它们分成若干个等级,分别采用不同的压缩算法。将图像的3个独立的颜色分量按某种方式组合成1个来搜索匹配块,从而需要将存储和搜索的3个颜色分量匹配块减少为1个。

相关数据调研!关注实际数据,用数据说话

JPEG压缩计算器