zoukankan      html  css  js  c++  java
  • 【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码

    一、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)} imes 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)} imes Ceil(k / 2))

    4. 截断指数哥伦布编码 te(v)

    解码时,首先需要判断的是语法元素的取值范围,假定为([0, x], x≥1)。根据x的取值情况,语法元素根据下面不同情况进行解析:

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

    5. 映射指数哥伦布编码 me(v)

    适用于预测模式为Intra_4x4, Intra_8x8或Inter的宏块的coded_block_pattern的编码。me(v)的映射方式并无指定的换算公式,通常由查表的方式进行。

    三、指数哥伦布编码同哈夫曼编码的比较:

    1. 哈夫曼编码在编码过程中考虑了信源各个符号的概率分布特性,根据符号的概率分布进行编码,不同的信源的哈夫曼编码的结果不同;指数哥伦布编码对所有信源统一
    2. 哈夫曼编码在解码前必须额外获得一份当前信源的码表;指数哥伦布编码不需要
    3. 指数哥伦布编码的压缩比率通常比较低,对于有些信息甚至完全没有压缩效果;在不考虑码表的情况下,哈夫曼编码压缩率更高

    但是,实际上对于视频压缩而言,类似于哈夫曼编码所提供的压缩比率的优势远远不够,而且还需额外码表。因此在实际的视频编码方法中使用的是指数哥伦布编码,但是由于压缩率低,只作为少数的辅助语法元素的编码以及多数语法元素的二值化方法。

    真正贡献了高压缩比的为CAVLC和CABAC编码等,将在后续学习笔记中进行介绍。

  • 相关阅读:
    Android SDK
    1055
    清除浮动的三种方式
    解决块状元素垂直外边距的塌陷问题
    drf 验证接口权限
    Linux常用指令
    Linux安装python3,virtualenv和virtualenvwrapper
    Linux基本命令2
    Linux之文档与目录结构
    Linux基本命令
  • 原文地址:https://www.cnblogs.com/shuofxz/p/8507324.html
Copyright © 2011-2022 走看看