二进制算术编码
熵编码是一种无损编码方式:常见的
霍夫曼(Huffman)编码
算术编码
还有行程编码 (RLE)
基于上下文的自适应变长编码(CAVLC)
基于上下文的自适应二进制算术编码(CABAC)。
\(\quad\)JPEG用的是Huffman编码和算术编码,而CAVLC和CABAC是HEVC中使用的两种编码方式。
这里简述二进制算数编码的基本原理。
二进制化
当语法元素均匀分布时,可采用定长二元化。假设语法元素值为x,且x在[0,Max]间,则直接将x从十进制转为二进制得到二元化串。
二进制算术编码
通过区间递归的方式实现数据编码。
思考:算术编码的压缩本质,就是找一个二进制最短的小数作为最终编码。在保留字符排列顺序的同时,对于更高频出现的字符,也就是概率更大的字符,赋予更大的小数区间。为什么这样说?
比如在低精度的 [0.1, 0.2) 和 高精度的 [0.1111111111, 0.1111111112) 之间各找一个最短编码的二进制进行比较,肯定是 [0.1, 0.2) 中找到的的最短二进制编码更短。
所以算术编码的实现途径就是:尽量使最终目标区间的范围更大。
目标区间长度=1*每个字符出现的概率累乘 所以我们希望出现频率高的字符作为更大的因子。