目录
指数哥伦布编码与霍夫曼编码对比
相同点:
- 指数哥伦布编码同哈夫曼编码一样,都属于变长编码的一种
即,针对不同的码原,每个码字的长度也是不一样的(唯一共同点)
不同点:
- 信源相关性:哈夫曼编码依赖于信源的概率分布,对于不同信源,构建出的霍夫曼码表是不同的;指数哥伦布编码与信源无关,所有信源的编码规则都是一致的
- 额外信息:哈夫曼编码的数据必须额外携带与该信源匹配的码表;指数哥伦布编码无须携带任何额外信息(与上一条相关)
压缩效率:
- 指数哥伦布编码的压缩率通常较低,甚至毫无压缩效果
- 在不考虑码表的情况下,霍夫曼编码压缩效率更高,也就是所谓最优编码方法
复杂度:
霍夫曼编码相较于指数哥伦布编码运算非常复杂,且需要传输对应码表,增加了传输的负荷,这对压缩比率也造成不利的影响
对于大量数据压缩,如视频编码,霍夫曼编码所提供的这些优势是远远不够的。因此在实际视屏编码方法中使用的是指数哥伦布编码,但也仅仅是用于少数辅助语法元素的编码以及大多数语法元素的二值化的方法
。真正贡献了压缩比例的方法是CAVLC和CABAC,后面再写文章整理。
指数哥伦布编码的分类
ue(v)是其他变型算法的基础,其他算法的结果是由ue(v)的结果进一步处理得到
ue(v)—0阶无符号指数哥伦布编码
如果不考虑视频编码,指数哥伦布编码是可以按阶段区分的。我们只需要了解0阶,一阶二阶的无符号指数哥伦布编码没有应用到视频压缩当中。
一阶和二阶的指数哥伦布编码和0阶的方法和思想类似,只是码表的形式不一样。
- ue(v)的码字分为三部分:
[prefix] + 1 + [surfix]
- 其中,
[prefix]
部分为连续n个0,[surfix]
部分为表示实际数值的信息为,其长度与[prefix]
一致
即,若prefix是3个0,后面的surfix也是3个0 [prefix]
和[surfix]
的长度由码原取值决定
计算方法:
- 首先统计前缀有多少个0
- 然后计算后缀部分由二进制转为10进制的取值,就是下面的xxx
- 实际表示为
2^(前缀0的个数) - 1 + xxx
比如前面的前缀0是1个,后面的x为1,那么codeNum = 2-1+1=2
下面多举几个例子
- 010——0
- 011——1
- 00000|1|00011——2^5-1+3=34
根据这个公式,我们就可以写出比特位和码原对应的码表
这就是h264中采用的无符号的指数哥伦布编码的编码方法。
se(v)——有符号指数哥伦布编码
有符号指数哥伦布编码是从无符号指数哥伦布编码的值换算得来。
换算公式如下:
se = (-1)^(k+1) x Ceil(k/2)
无符号编码+1奇数为正偶数为负,将无符号的编码值除以2再向上取整
如无符号codNum=1,那么有符号的codNum为1 x Ceil(k/2) = 1
se、ue相关标准协议文档的阅读
指数哥伦布编码相关内容可以在h264标准协议文档中找到
unsigned exp-golomb codes
signed exp-golomb codes
te(v)和me(v)——截断和映射指数哥伦布编码
te(v):截断指数哥伦布编码
解码时首先判断语法元素的取值范围[0,x],x>=1:
- 若x>1,解析方法同ue(v)
unsigned exp-gloexp-golomb codes
相同 - 若x=1,语法元素值等同于下一位bit值的取反
me(v):映射指数哥伦布编码
适用于预测模式为Intra_4x4
,Intra_8x8
(帧内模式)或Inter
(帧间模式)的宏块的coded_block_pattern
- 无指定的换算公式,通常通过查表的方式进行
te、me相关标准文档阅读