• HEVC熵编码核心点介绍


    熵编码基本原理

    熵编码

    1. 熵编码是指按信息熵原理进行的无损编码方式,无损熵编码也是有损视频编码中的一个关键模块,它处于视频压缩系统的末端。
    2. 熵编码把一些列用来表示视频序列的元素符号转变为一个用来传输或存储的压缩码流,输入的符号可能包括量化的变换系数、运动矢量信息、预测模式信息等。
    3. 熵编码可以有效去除这些视频元素符号的统计冗余,是保证视频编码压缩效率的重要工具之一。

    消息与信息

    1. 把客观物质运动和主观思维的活动状态表达出来就成为了消息;消息中包含信息,是信息的载体;因此,信息与消息既有区别又有联系的;
    2. 获取信息的过程就是一个消除或部分消除不确定性的过程;
    3. 信息是事物运动状态或存在方式的不确定性的描述;
    4. 信息的多少我们称为信息量
    5. 信息量与不确定性消除的程度有关,消除的不确定性大,信息量就大;反之,信息量就小;
    6. I(xi)通常被称为信源符号 xi 的自信息,表征该符号出现的不确定性;自信息是信源发出某一符号所含有的信息量,信源发出的符号不同, 含有的信息量不同;所有自信息不能作为整个信源信息量的测度。
      在这里插入图片描述

    1. 自信息的数学期望为信源的信息熵
      在这里插入图片描述

    2. 信息熵是从平均意义上表示信源的总体信息测度,可以理解为信源 X 每输出一个符号所提供的平均信息量;

    3. 任何概率分布都满足 0<=P(xi)<=1,所以熵的取值总是非负数;

    变长编码

    1. 对信源输出的消息 (一个信源符号或者固定数目的多个信源符号) 采用不同长度的码字表示,这种编码方式称为变长编码
    2. 为了提高编码效率,需要根据符号出现的概率大小设计码长,即对于大概率符号采用较短的码字表示 ,小概率符号采用较长的码字表示,以达到平均码长最短的目的;
    3. 变长码必须是唯一可译码,才能实现无失真编码
    4. 若有一个唯一可译码,其平均长度小雨所有其他唯一可译码的平均长度,则称该码为最佳码
    5. 无失真信源编码的基本问题就是要找到最佳码;
    6. 哈夫曼编码是一种最佳变长码;但存储空间要求大、解码复杂度高;
    7. 指数哥伦布码(Exponential Golomb Code)是弥补哈夫曼的不规则结构的解码复杂度,应用最广泛的;

    算术编码

    1. 与变长码不同,算术编码的本质是为整个输入序列分配一个码字, 而不是给每个输入流中的每个字符分别指定码字, 因此平均意义上可以为单个字符分配码长小于1 的码字,所以算术编码可以给出接近最优的编码结果;

    2. 算术编码的基本原理:
      根据信源可能发生的不同符号序列的概 率, 把 [0, 1) 区间划分为互不重叠的子区间,子区间的宽度恰好是各符号序列的概率 , 这样信源发出的不同符号序列将与各子区间一一对应。因此每个子区间内的任意一个实数都可以用来表示对应的符号序列 , 这个数就是该符号序列所对应的码字。显然,一串符号序列发生的概率越大,对应的子区间就越宽,要表达它所用的比特数就越少,因而相应的码字就越短。

    3. 算术编码的两个基本参数:符号的概率和它的编码间隔;信源符号概率决定编码过程中信源符号的间隔,而这些间隔包含在0到1之间,编码过程中的间隔决定了符号压缩后的输出。

    4. 实际中计算机的精度不可能无限长,明显的问题就是运算出现溢出,考虑计算机的 16、32、64 位精度,可以用比例缩放方法解决;

    5. 算术编码器对整个消息只产生一个码字,在间隔[0, 1)中的一个实数,因此译码器在收到表示这个实数的所有位之前不能进行译码;

    6. 算术编码也是一种对错误很敏感的编码方法,如果有一位发生错误会导致整个消息译错;

    7. 算术编码可以是静态的或者自适应的,静态算术编码中,信源符号的概率是固定的,自适应算术编码中,信源符号的概率根据编码时符号出现的频繁程度动态的进行修改;开发动态算术编码是因为事先知道精确的信源概率是很难的,且不切实际;在编码期间估算信源符号概率的过程叫建模动态建模决定编码器压缩效率的关键因素

    零阶指数哥伦布编码

    1. 指数哥伦布码属于可变长码,其基本原理是用短码表示出现概率较高的信息,而用长码表示出现频率较低的信息;
    2. 在熵编码中,很多语法元素都采用指数哥伦布码的形式映射为二进制比特流,其中零阶指数哥伦布编码应用非常广泛;
    3. 零阶指数哥伦布码是指数哥伦布码家族中的一员,它可以直接根据公式解析码字,无须查表,解码复杂度较低;
    4. 虽然 CABAC 作为 h265 标准的主要熵编码方法,但是由于零阶指数哥伦布编解码简单,且对广义高斯信源的压缩效率也较高,在h265中被用于视频参数集VPS、序列参数集SPS、图像参数集PPS、片头信息等所设计的大部分语法元素中;
    5. 主要分为无符号数的指数哥伦布编码ue(v)、有符号数的指数哥伦布编码se(v)
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    CABAC

    1. 基于上下文的自适应二进制算术编码(CABAC)是一种将自适应的二进制算术编码与一个设计精良的上下文模型结合起来的方法;

    2. 采用了算术编码思想,同时充分考虑了视频流相关统计特性,提高了编码效率;在编码中,每一个符号的编码都与以前编码的结果有关,根据符号流的统计特性来自适应地为每一个符号分配码字。

    3. 基本步骤:二进制化、上下文建模、二进制算术编码,如下图;

    二进制化是将一个给定的非二进制语法元映射成一个二进制序列,即一个二元流(Bin String),若输入的语法元素本身就是一个二进制语法元素,则忽略此过程,数据会通过一条旁路直接送往下一步;

    虽然霍夫曼二元化效率高,但因为码字结构不规则,需要对码表进行存储并且解码不断查表,导致复杂度很高,实际应用一般都采用一元码、定长码、指数哥伦布码的二元方法;

    h265中采用的是截断莱斯二元化TRK阶指数哥伦布二元化EGK定长二元化FL;不同的语法元素采用不同的二元化方法;


    上下文建模即二元算术编码有常规编码模式和旁路编码模式两种以供选择,在常规编码模式中,语法元素的二元位(Bin)顺序地进入上下文模型器,编码器根据先前编码过的语法元素或二元位的值,为每一个输入的二元位分配合适的概率模型,此过程就是上下文建模

    根据条件熵理论,利用其他己编码的语法元素进行条件编码 ,相对于独立编码或者无记忆编码能够进一步提高编码性能,这些用来作为条件的己编码符号信息称为上下文

    条件越多所得到的条件熵就越小,因此提高上下文阶数能够获取更好的编码性能,但随着上下文模型阶数的增加,对概率模型存储和更新的复杂度也惊人的速度增加,所以在设计上下文模型时,既要考虑提高编码效率,又要考虑实现复杂度;

    在h265中采用查表的方式来为每种语法元素进行上下文模型参数初始化;


    二进制算术编码对当前语法元素二进制化后的每一个 Bin 根据其概率模型参数进行算术编码,得到最后的输出码流;

    二进制算术编码基于递归区间划分的方式,在递归过程中保存编码区间和区间下限;

    包括两种编码方式:常规编码旁路编码,常规编码利用自适应的概率模型进行编码,旁路以等概率的方式进行编码。


    在这里插入图片描述

    变换系数熵编码

    1. 量化后变换系数的熵编码在整个熵编码中占有举足轻重地位,量化后变化系数大多为零值或幅度较小的值;

    2. 通过编码非零系数的位置信息和非零系数的幅值来表示变换系数;

    3. 变换系数的扫描
      ○ 在 h265中变换系数的扫描是基于4x4大小的子块进行,较大的TB都需要进行分割成多个4x4子块;
      ○ h265中扫描方式:对角扫描(类似h264中的zig-zag)、水平扫描、垂直扫描;
      ○ h265中扫描方式与预测模式存在对应关系,如4x4和8x8TB帧内预测,垂直预测模式对应水平扫描方式;16x16、32x32TB的帧内以及帧间预测模式采用对角扫描;
      在这里插入图片描述

    4. 一个 TB 的变换系数经过扫描后就可得到一组一维的变换系数,该组系数可以根据非零系数位置信息和幅值信息完全表示,h265标准对变换后的非零系数位置信息和幅值信息进行CABAC编码。

    符号数据隐藏技术SDH

    参考:https://blog.csdn.net/Dillon2015/article/details/104254432

    1. 为什么用SDH
      因为每个非零系数符号语法元素采用coeff_sign_flag来标识,用来表示该系数是正值还是负值,通过旁路编码器进行熵编码,可以加快整个编码以及解码的速度,该标识在视频压缩码流里占据很大比例,大约15%~20%

    2. 为了减少其比特数,H265中对非零系数符号允许使用符号数据隐藏技术(Sign Data Hiding,SDH);

    3. 是否采用 SDH 技术需要显式标识,图像参数集中的语法元素 sign_data_hiding_enabled_flag 置为 1 表示允许编码器应用 SDH 技术。

    CG

    1. 每个4x4子块扫描后得到的16个连续的系数称为系数组(Coefficient Group,CG)。
    2. 原理:
      首先计算CG内所有非零系数绝对值之和,若和为偶数则CG内最后一个非零系数被判定为“+”;若和为奇数则CG内最后一个非零系数被判定为“-”;使用SDH后解码端可以直接判断CG中最后一个非零系数的符号,编码端可以省略它的语法元素coeff_sign_flag的熵编码。

    当SDH得到的符号和CG内最后一个非零系数符号不一致时就需要调整CG中某个非零系数,将它的值加1或减1,以使其和真实符号一致。所以使用SDH技术可能会带来变换系数的失真,但符号位在熵编码时使用的是旁路编码模式开销较大,使用SDH技术节约的码率大于一个变换系数失真带来的影响。

    1. 后果
      视频编码中除了量化会引入失真,SDH也会引入失真。
  • 相关阅读:
    6种方法轻松将PDF转换为Word文档,办公必备!
    vue-vuex
    shell SQL 变量 Oracle shell调用SQL操作DB
    阿里架构师:让Spring不再复杂
    腾讯云2023年双11优惠活动和9999元代金券领取规则
    垃圾回收调优(GC调优)
    C语言规范
    Calendar日历类
    笔记(一)斯坦福CS224W图机器学习、图神经网络、知识图谱
    C++学习——构造函数、析构函数
  • 原文地址:https://blog.csdn.net/yanceyxin/article/details/130855066