八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码

本文介绍了H.264编码中熵编码的基本方法,重点讲解了指数哥伦布编码,包括它与哈夫曼编码的区别,以及0阶无符号、有符号、截断和映射四种类型的指数哥伦布编码的详细内容。指数哥伦布编码在视频编码中主要作为辅助语法元素的编码方式,尽管压缩效率较低,但因其简单性和无需额外信息的优势被H.264标准采用。
摘要由CSDN通过智能技术生成

由于种种问题,哈夫曼编码并没有作为一种实际应用的技术使用到实际编码算法中;本节看下H.264中实际使用的熵编码算法:指数哥伦布编码
在H264官方标准文档的第九章由说明

一、H.264中熵编码基本方法

  • 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流
  • 之前我们成功从NAL Unit中获取到语法元素的码流之后,接下来就是对语法元素的码流进行解析。熵编码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用
  • 在H.264的标准协议中,不同的语法元素指定了不同的熵编码方法。在协议文档中共指定了10种语法元素的描述符,这些描述符表达了码流解析为语法元素值的方法,其中包含了H.264标准所支持的所有熵编码方法:
语法元素描述符编码方法
b(8)8位二进制比特位串,用于描述rbsp_byte()
f(n)n位固定模式比特位串,从最左bit开始计算
u(n)使用n位无符号整数表示,由n位bit换算得到
i(n)使用n位有符号整数表示,由n位bit换算得到
ue(v)使用无符号指数哥伦布编码
se(v)使用有符号指数哥伦布编码
te(v)使用截断指数哥伦布编码
me(v)使用映射指数哥伦布编码
ce(v)上下文自适应的变长编码cavlc
ae(v)上下文自适应的二进制算术编码cabac

最常用的为变长编码和算术编码,提供更好的压缩效率,远比指数哥伦布算法复杂的多

二、指数哥伦布编码

  • 同哈夫曼编码一样,指数哥伦布编码同样属于变长编码(VLC)的一种,也就是说针对不同的码源分配了bit位长度不同的码字

指数哥伦布编码和哈夫曼编码的区别:

  • 信源相关性:哈夫曼编码依赖于信源的概率分布;指数哥伦布编码与信源无关;因此对于不同的信源,即使是相同的符号的哈夫曼编码的结果也是不同的;指数哥伦布编码针对不同的信源采用的编码是统一的,因此无论是什么样的输入,输出的编码后的数据都是一致的。
  • 额外信息: 哈夫曼编码的数据必须额外携带与该信源匹配的码表;指数哥伦布编码无需携带任何额外信息
  • 由于未考虑信源的实际特性,指数哥伦布编码的压缩比率通常比较低,对于有些信息甚至完全没有压缩效果,输出数据比原始数据更大,在这一点上哈夫曼编码作为“最优编码”在效率上更高;然而由于哈夫曼编码运算较指数哥伦布编码更为复杂,且必须保存码表信息增加了传输负荷,也对压缩比率造成了不利影响
      实际上,对于视频压缩这样的需求而言,类似于哈夫曼编码所提供的压缩比率的优势远远不够,而且像H.264等编码标准都不会指望靠这样的方式来提高压缩比率。因此在实际的视频编码方法中使用的是指数哥伦布编码,但是只作为少数的辅助语法元素的编码以及多数语法元素的二值化方法。真正贡献了高压缩比还需要后面详述的CAVLC和CABAC等。

三、指数哥伦布编码的分类

  • H.264中定义的指数哥伦布编码共分四类:
    在这里插入图片描述
  • 其中ue(v)是其他变型算法的基础,其他算法的结果由ue(v)的结果进一步处理得到

1、0阶无符号指数哥伦布编码ue

  • 如果不考虑视频编码的话,只是哥伦布编码是分为很多阶的,实际视频编码中使用0阶
  • ue(v)的码字分为三部分:
    • [prefix] + 1 + [surfix]
    • 其中,[prefix]部分为连续n个0,[surfix]部分为表示实际数值的信息位,其长度与[prefix]一致;
    • [prefix]和[surfix]的长度由码元取值确定
0阶指数哥伦布编码模板适用码元值
10
0 1 x1, 2
0 0 1 x x3~6
0 0 0 1 x x x7~14
0 0 0 0 1 x x x x15~30
0 0 0 0 0 1 x x x x x31~62
…………

计算公式: codeNum = 2^LeadingZeroBits - 1 + (xxx)
  前缀0的长度以LeadingZeroBits表示,(xxx)为二进制数值xxx的10进制表示,因此,指数哥伦布编码的码字与码元值的对应关系如下表:

指数哥伦布编码码字码元数值
10
0 1 01
0 1 12
0 0 1 0 03
0 0 1 0 14
0 0 1 1 05
0 0 1 1 16
0 0 0 1 0 0 07
…………
  无符号指数哥伦布编码是其余多种变形算法的基础,其余的比如有符号指数哥伦布编码、映射指数哥伦布编码、截断指数哥伦布编码都是由无符号指数哥伦布编码进一步处理得到的。

2、有符号指数哥伦布编码se

  • 有符号指数哥伦布编码通过无符号指数哥伦布编码换算得到,换算个关系为:
n = (-1)^(k+1) * Ceil(k/2)		//n表示se对应的值,k表示无符号的码元,ceil向上取整
  • se和ue的相互关系可以表示为下表:
codeNumsyntax element value
00
11
2-1
32
4-2
53
6-3
k(-1)^(k+1)*Ceil(k/2)

3、截断指数哥伦布编码te

截断指数哥伦布编码的语法元素描述符为te(v)。当语法元素以te(v)解码时,首先需要判断的是语法元素的取值范围,假定为[0, x], x≥1。根据x的取值情况,语法元素根据下面不同情况进行解析:

  • 若x>1,解析方法同ue(v)相同;
  • 若x=1,语法元素值等同于下一位bit值的取反。

4、映射指数哥伦布编码me

映射指数哥伦布编码的描述符为me(v),适用于预测模式为Intra_4x4, Intra_8x8或Inter的宏块的coded_block_pattern的编码。me(v)的映射方式并无指定的换算公式,通常由查表的方式进行:
在这里插入图片描述

四. 0阶无符号指数哥伦布编码的实现Demo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值