一 H.264 中的熵编码基本方法:
熵编码具有消除数据之间统计冗余的功能, 在编码端作为最后一道工序, 将语法元素写入输出码流
熵解码作为解码过程的第一步, 将码流解析出语法元素供后续步骤重建图像使用
在 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) 的一种
二者显著区别:
信源相关性: 哈夫曼编码依赖于心愿的概率分布; 指数哥伦布编码与信源无关
额外信息: 哈弗曼编码的数据必须额外携带与该信源匹配的码表; 指数哥伦布编码不需额外信息
1. 指数哥伦布编码的分类
常用的指数哥伦布编码通常可以分为四类:
语法元素描述符 | 编码方法 |
---|---|
ue(v) | 使用无符号指数哥伦布编码 |
se(v) | 使用有符号指数哥伦布编码 |
te(v) | 使用截断指数哥伦布编码 |
me(v) | 使用映射指数哥伦布编码 |
其中无符号指数哥伦布编码 ue(v)是其他编码方式的基础, 其余几种方法基本可以由 ue(v)推导得出
2. 0 阶 (零阶) 无符号指数哥伦布编码 ue(v)
ue(v)的码字可以分为三个部分:
[prefix] 1 [surfix]
其中前缀码为 n 个 bit 长度的 0, 后缀码为表示实际数值的信息位, 信息位的长度等于前缀码中 0 的个数
指数哥伦布编码中前缀和后缀部分的长度根据码元数值来确定:
0 阶指数哥伦布编码模板 | 适用码元值 |
---|---|
1 | 0 |
0 1 x | 1, 2 |
0 0 1 x x | 3~6 |
0 0 0 1 x x x | 7~14 |
0 0 0 0 1 x x x x | 15~30 |
0 0 0 0 0 1 x x x x x | 31~62 |
…… | …… |
编码模板的后缀部分, xx 以二进制的形式表示解码后的数值
前缀 0 的长度以 LeadingZeroBits 表示, 那么解码后数值为:\(codeNum = 2^{LeadingZeroBits} - 1 + (xxx)\)(xxx)为二进制数值 xxx 的 10 进制表示举例如下:
指数哥伦布编码码字 | 码元数值 |
---|---|
1 | 0 |
0 1 0 | 1 |
0 0 1 0 1 | 4 |
0 0 0 1 0 0 0 | 7 |
编解码过程:
编码:
codeNum = 13,
前缀 0 的个数:\(prefixLen = floor[log_2(codeNum+1)] = 3\);
后缀部分的二进制:\(codeNum+1-2^{prefixLen} = 14-8 = 6 = b(1 1 0)\)
因此 13 的指数哥伦布编码码字为 0 0 0 1 1 1 0
解码:
指数哥伦布码 0 0 0 0 1 0 1 0 1
解码后的数值为 \(2^4-1+5 = 20\)
3. 有符号指数哥伦布编码 se(v)
有符号的指数哥伦布编码值是通过无符号的指数哥伦布编码的值通过换算得到的
其换算关系为:\(n = (-1)^{(k+1)} \times Ceil(k / 2)\)
就是说: 先按无符号方式解码, 得到的十进制数字两个一组, 绝对值相同, 第一个是正的, 第二个是负的
下表为有符号和无符号指数哥伦布编码之间的换算关系:
指数哥伦布编码码字 | 无符号解码结果 | 有符号解码结果 |
---|---|---|
1 | 0 | 0 |
0 1 0 | 1 | 1 |
0 1 1 | 2 | -1 |
0 0 1 0 0 | 3 | 2 |
0 0 1 0 1 | 4 | -2 |
k | \((-1)^{(k+1)} \times Ceil(k / 2)\) |
4. 截断指数哥伦布编码 te(v)
解码时, 首先需要判断的是语法元素的取值范围, 假定为 \([0, x], x1\)根据 x 的取值情况, 语法元素根据下面不同情况进行解析:
若 x>1, 解析方法同 ue(v)相同
若 x=1, 语法元素值等同于下一位 bit 值的取反
5. 映射指数哥伦布编码 me(v)
适用于预测模式为 Intra_4x4, Intra_8x8 或 Inter 的宏块的 coded_block_pattern 的编码 me(v)的映射方式并无指定的换算公式, 通常由查表的方式进行
三指数哥伦布编码同哈夫曼编码的比较:
哈夫曼编码在编码过程中考虑了信源各个符号的概率分布特性, 根据符号的概率分布进行编码, 不同的信源的哈夫曼编码的结果不同; 指数哥伦布编码对所有信源统一
哈夫曼编码在解码前必须额外获得一份当前信源的码表; 指数哥伦布编码不需要
指数哥伦布编码的压缩比率通常比较低, 对于有些信息甚至完全没有压缩效果; 在不考虑码表的情况下, 哈夫曼编码压缩率更高
但是, 实际上对于视频压缩而言, 类似于哈夫曼编码所提供的压缩比率的优势远远不够, 而且还需额外码表因此在实际的视频编码方法中使用的是指数哥伦布编码, 但是由于压缩率低, 只作为少数的辅助语法元素的编码以及多数语法元素的二值化方法
真正贡献了高压缩比的为 CAVLC 和 CABAC 编码等, 将在后续学习笔记中进行介绍
来源: https://www.cnblogs.com/shuofxz/p/8507324.html