Entropy coding - baidut/co-codec GitHub Wiki

统计冗余对于一串由许多数值构成的数据来说,如果其中某些值经常出现,而另外一些值很少出现,那么,这种由于取值上统计的不均匀性就构成了统计冗余。数据用有限的符号来表示,因此长数据序列的统计冗余普遍存在,统计冗余是最低级的相关性。

熵编码是一种基于统计冗余的无损压缩编码

变长编码

通用编码(Universal code)-适用于传输符号的概率分布不可知,但已经概率大小排列的情形。 特点:数字的大小越大,则编码长度也越大

  • Unary coding 6 --> 111110 N个1,0结束
  • Fibonacci coding 基于斐波那契数列项的线性组合压缩
  • 把一个数分割成两部分,第一部分采用Unary编码,剩余部分的范围是确定的,采用截断二进制编码:
    • Golomb coding 用一个参数M去除,商部分的Unary编码+余数部分的截断二进制编码
    • Elias gamma coding 2的N次幂的Unary编码+余数部分的截断二进制编码
  • Elias omega coding
  • Levenshtein coding
  • 还有很多... 由于在视频压缩中不常用,所以不再赘述

已知概率分布信息时 由于利用了概率分布特性,压缩性能更优 对分布概率高的符号分配较短的码字,而对分布概率较低的符号分配较长的码字,因此适用于符号之间分布概率不均匀的情形,即信源熵较小的情形(随机程度低)

  • Shannon–Fano coding 香农信息论中提出的一种较优的编码,基本思想是不断将传输的符号划分成总体概率相近的两组,生成二叉树,得到前缀码。虽然不是最优的编码,但是确保了每个码字的长度都在理想长度的1位误差内
  • Huffman coding理论上压缩性能最优的变长编码,通过生成概率平均码长最小的二叉树的前缀码进行编码

算术编码

变长编码的码字长度为整数,而由信息论计算得到的最优码字长度通常为小数,为了进一步提高压缩性能,算术编码(Arithmetic coding)将整个信息压缩成为一个码字,而不是对每个符号分配一个码字,这样就可以更加接近信息熵理论编码的极限。

对实验数据的分析:

输入为二进制的情形,如果0和1的概率差很大,由于会产生很多连续的0或1,适合用游程编码;如果0和1的概率接近,则适合进行算术编码或者ANS编码,

各种编码的压缩性能benchmark

编码的matlab实现, 上下文信息的利用

对01是不对称的,1越多越利于压缩,1不会引起精度溢出问题?