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)将整个信息压缩成为一个码字,而不是对每个符号分配一个码字,这样就可以更加接近信息熵理论编码的极限。
- Range encoding将二进制编码推广到N进制编码
- quasi-arithmetic coding类算术编码
对实验数据的分析:
输入为二进制的情形,如果0和1的概率差很大,由于会产生很多连续的0或1,适合用游程编码;如果0和1的概率接近,则适合进行算术编码或者ANS编码,
各种编码的压缩性能benchmark
编码的matlab实现, 上下文信息的利用
对01是不对称的,1越多越利于压缩,1不会引起精度溢出问题?