CABAC基础一-二值化

原创 2016年08月28日 17:28:12

 

1.  二值化

在HEVC中主要包括截断莱斯编码(Truncated Rice),指数哥伦布编码(Exp-Golomb)和定长编码。

 

1.1.  TR

TR二值化需要输入三个参数:synVal表示将要进行TR二值化的值,cRiceParam表示莱斯参数,cMax表示门限值。TR二值化的结果由两部分组成:前缀prefixVal是一元码,后缀suffixVal是定长码,后缀长度为cRiceParam。

其中,prefixVal =synVal >> cRiceParam

suffixVal = synVal − ( ( prefixVal ) << cRiceParam)

即:synVal = prefixVal << cRiceParam + suffixVal

当prefixVal < (cMax>> cRiceParam)时前缀长度为prefixVal+1,由prefixVal个1和一个0组成;否则前缀由(cMax >>cRiceParam)个1组成,如表1-1所示。

表1-1 TR前缀表

prefixVal

前缀

0

0

1

10

2

110

cMax>>cRiceParam

cMax>>cRiceParam "1"

 

suffixVal按定长码计算,位数为cRiceParam。有两种情况无后缀:

a)       cRiceParam=0;

b)       synVal =cMax。

以cRiceParam=1,cMax=7时TR二值化为例,如表1-2所示。 当synVal=6时,(synVal>> cRiceParam)=3,(cMax>> cRiceParam)也等于3,因此前缀由(cMax >>cRiceParam)=3个1组成,后缀suffixVal = synVal − ( ( prefixVal) << cRiceParam)=6-(3<<1)=0,因此二进制串为1110。

表1-2 cRiceParam=1,cMax=7时TR二值化表

cRiceParam=1, cMax=7

synVal

bin string

前缀

后缀

0

0

0

1

0

1

2

10

0

3

10

1

4

110

0

5

110

1

6

111

0

7

111

1

 

1.2.  指数哥伦布

指数哥伦布编码也是变长编码的一种,指数哥伦布编码也是由前缀和后缀组成,下面以非负整数的k阶指数哥伦布为例讲解二进制串的生成步骤。

1.       将N以二进制形式表示,去掉最低的k个比特,之后加1;

2.       计算剩余的比特数,将此数减1,即是需要增加的前缀0的个数;

3.       将1中去掉的最低k个比特补回比特串末尾。

 

以数字6的一阶指数哥伦布编码为例:

1.       6的二进制串为110,去掉最低位的1个比特变成11,加上1变成100;

2.       100的比特数为3,将此数减1,得到前缀0的个数为2;

3.       将比特串最低位的0补回比特串末尾,得到00 100 0。

 

解析k阶指数哥伦布码的方式如图1所示。图1(a)展示了指数哥伦布编码的组成:由m个前导0,m+1个二进制串和k个末尾串组成;但在指数哥伦布进行解析的时候是按照图1(b)所示形式进行解析的,首先从比特流当前位置开始寻找第一个非零比特,并将找到的0比特个数记为m,第一个非零比特之后的m+k个二进制串的十进制值记为Value,如图1(c)所示,根据步骤1所述:去掉最低的k个比特,之后加1,相当于Value的值中包含了一个额外添加的2^k,同时,在进行码流解析时,m个前导0之后的第一个非零比特没有被计算在Value值内。

                                                                   

        

(a) 指数哥伦布编码组成                 (b) 指数哥伦布解析形式


(c) 指数哥伦布值的计算

图1. 指数哥伦布编码

 

因此解码值CodeNum的计算方式如下:

CodeNum =2^(m+k) – 2^(k) + Value

 

在HEVC中常用的是0阶指数哥伦布编码,分为无符号0阶哥伦布指数编码和有符号数0级哥伦布指数编码,如表1-3所示,其中CodeNum表示解码值,有符号所对应的列表示无符号编码是所对应的值,有符号表示采用有符号0阶指数哥伦布编码时所对应的十进制数。

表1-3 0阶有符号和无符号指数哥伦布编码

码字

CodeNum

无符号

有符号

1

0

0

0

010

1

1

1

011

2

2

-1

00100

3

3

2

00101

4

4

-2

00110

5

5

3

00111

6

6

-3

 

1.3.  定长编码

定长编码比较简单,再次不再详述。

1.4.  二值化示例

以上详细说明了TRk和EGk二值化算法的过程,表1-4简单列举了各种二值化方法的结果。

 

       表1-4 二值化TRk、EGk和FL二值化结果

N

Unary(U)

Truncated

Unary(TrU)

Truncated

Rice(TRk)

Exp-Golomb

(EGk)

Fixed-Length

(FL)

cMax=7

k = 1; cMax=7

k = 0

cMax=7

0

0

0

00

1

0

1

10

10

01

010

1

2

110

110

100

011

10

3

1110

1110

101

00100

11

4

11110

11110

1100

00101

100

5

111110

111110

1101

00110

101

6

1111110

1111110

1110

00111

110

7

11111110

1111111

1111

1000

111

相关文章推荐

CAVLC和CABAC简介

CABAC/CAVLCin H.264 什么是熵编码? 熵编码压缩是一种无损压缩,其实现原理是使用新的编码来表示输入的数据,从而达到压缩的效果。常用的熵编码有游程编码,哈夫曼编码和CAVLC编码等...
  • jubincn
  • jubincn
  • 2011年11月08日 15:56
  • 22800

CABAC 详述

由三个部分组成: 一. 二进制化 (主要是将非二制的各语法元素转换成二进制的比特序列,也可以称为对输入流的预编码,经它编码后的输出是MPS概率极高的比特流。) MPS(高概率符号0或1) 、LPS(低...
  • easecom
  • easecom
  • 2009年09月04日 14:40
  • 5612

CABAC基础四-CABAC熵解码算法FFmpeg实现

1.  CABAC熵解码算法FFmpeg实现 本章主要讲解FFmpeg中对CABAC熵解码算法的实现和优化思路。由于算术编码算术在H264和H265中没有发生变化,所以FFmpeg中H265的熵解码仍...

CABAC整体讲解1

参考的博客http://blog.sina.com.cn/s/blog_520811730101ljiw.html 1、CABAC熵编码 熵编码是视频编码的最后一步和解码的第一步所使用的一种无损编...

CABAC之手把手教你编码

首先要说明的是CABAC的生命期是SLICE,因此本篇所讲的也是一个SLICE里CABAC的流程,其次对于我们来说场模式几乎用不到,所以本文的编码流程只使用帧模式,因此实际上用到的表只有277个, 当...

CABAC编码

H.264/AVC标准采用了很多新技术和新方法,大大提高了视频编码效率,其中CABAC便是H.264/AVC采用的新型熵编码方法之一。CABAC采用了高效的算术编码思想,同时充分考虑了视频流相关统计特...

HEVC学习(二十) —— 熵编码之一

从本篇开始,接下来的若干篇会逐步分析HM 9.1中有关熵编码的过程。在此以及以后的几篇,我都默认大家对熵编码(针对CABAC,因为HEVC只有这一种编码方式,而H.264有CAVLC和CABAC两种)...
  • HEVC_CJL
  • HEVC_CJL
  • 2013年01月04日 15:46
  • 17523

cabac编码过程的解读

源地址:http://blog.163.com/laorenyuhai126%40126/blog/static/193507792010813822759/ cabac编码过程的解读        ...

CABAC中的二值化方法

CABAC中的二值化方法1.二值化的一般性要求 在对片进行编码的过程中,相应的二值化方案要满足快速精确的条件误差估计原则 二值化的结果要方便进行条件概率的计算以及后续的算术编码 2.为什么要进行二值...

图像处理理论(一)——直方图、二值化、滤波基础

直方图、二值化、滤波基础
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CABAC基础一-二值化
举报原因:
原因补充:

(最多只允许输入30个字)