CABAC编码——二进制编码

时间:2024-04-15 22:50:24

概念

在了解二进制编码之前,我们首先需要建立一个完整的体系架构

  • 熵编码
    即编码过程中按熵原理不丢失任何信息的编码。信息熵为信源的平均信息量(不确定性的度量)。常见的熵编码有:香农(Shannon)编码、哈夫曼(Huffman)编码和算术编码(arithmetic coding)。
  • CABAC
    CABAC(Context-based Adaptive Binary Arithmetic Coding),基于上下文的自适应二进制算术编码。CABAC是H.264/AVC标准中两种熵编码中的一种,它的编码核心算法就是算术编码(Arithmetic Coding)
    image

熵编码

VLC 编码:

让我们假设我们有一个符号流:a, e, rt,它们的概率(从0到1)由下表所示。

a e r t
概率 0.3 0.3 0.2 0.2

我们可以分配不同的二进制码,(最好是)小的码给最可能(出现的字符),大些的码给最少可能(出现的字符)。

a e r t
概率 0.3 0.3 0.2 0.2
二进制码 0 10 110 1110

让我们压缩 eat 流,假设我们为每个字符花费 8 bit,在没有做任何压缩时我们将花费 24 bit。但是在这种情况下,我们使用各自的代码来替换每个字符,我们就能节省空间。

第一步是编码字符 e10,第二个字符是 a,追加(不是数学加法)后是 [10][0],最后是第三个字符 t,最终组成已压缩的比特流 [10][0][1110]1001110,这只需 7 bit(比原来的空间少 3.4 倍)。

请注意每个代码必须是唯一的前缀码,Huffman 能帮你找到这些数字。虽然它有一些问题,但是视频编解码器仍然提供该方法,它也是很多应用程序的压缩算法。

编码器和解码器都必须知道这个(包含编码的)字符表,因此,你也需要传送这个表。

算术编码

让我们假设我们有一个符号流:a, e, r, st,它们的概率由下表所示。

a e r s t
概率 0.3 0.3 0.15 0.05 0.2

考虑到这个表,我们可以构建一个区间,区间包含了所有可能的字符,字符按出现概率排序。

初始算法区间

让我们编码 eat 流,我们选择第一个字符 e 位于 0.3 到 0.6 (但不包括 0.6)的子区间,我们选择这个子区间,按照之前同等的比例再次分割。

第二个子区间

让我们继续编码我们的流 eat,现在使第二个 a 字符位于 0.3 到 0.39 的区间里,接着再次用同样的方法编码最后的字符 t,得到最后的子区间 0.354 到 0.372

image

我们只需从最后的子区间 0.354 到 0.372 里选择一个数,让我们选择 0.36,不过我们可以选择这个子区间里的任何数。仅靠这个数,我们将可以恢复原始流 eat。就像我们在区间的区间里画了一根线来编码我们的流。

最终区间横断面

反向过程(又名解码)一样简单,用数字 0.36 和我们原始区间,我们可以进行同样的操作,不过现在是使用这个数字来还原被编码的流。

在第一个区间,我们发现数字落入了一个子区间,因此,这个子区间是我们的第一个字符,现在我们再次切分这个子区间,像之前一样做同样的过程。我们会注意到 0.36 落入了 a 的区间,然后我们重复这一过程直到得到最后一个字符 t(形成我们原始编码过的流 eat)。

编码器和解码器都必须知道字符概率表,因此,你也需要传送这个表。

二进制算术编码

二进制算术编码的编码方法跟算术编码是一样的,但是输入只有两个符号:“0”,“1”,也就是说输入的是二进制串。

除了是对二进制串进行编码这个特征外,二进制算术编码跟普通的算术编码还有一些区别,总体上可以按照如下进行描述:

设输入符号串为s,s中的符号分为两种:MPS(Most Probability Symbol),LPS(Low Probality Symbol),分别代表出现概率大小的符号,需要根据实际情况进行调整。如果输入的二进制串中的“0”较多,“1”较少,那么MPS = “0”,LPS =“1”

在编码中进行区间选择时,MPS在前,LPS在后

与算术编码的方式相同,我们最终可以通过这个数字还原出编码的二进制串

CABAC

CABAC(Context-based Adaptive Binary Arithmetic Coding),基于上下文的自适应二进制算术编码
问题1:如何建立起一个01字符概率表
问题2:什么叫上下文
问题3:什么叫自适应
通过分片,对每一片(slice)进行动态的更新符号概率表
问题4:如何将待编码内容变成01串

参考文章

数字视频编码基础(https://github.com/leandromoreira/digital_video_introduction)
CABAC编码解析(https://blog.****.net/novice_growth/article/details/70830835)