当前位置: 首页 > news >正文

CABAC基础一-二值化

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

http://www.gsyq.cn/news/1454492.html

相关文章:

  • 基于Wio Terminal的双频WiFi分析仪:从硬件选型到可视化实现
  • 抖音下载器:如何轻松批量保存你喜欢的短视频与直播回放
  • DeepSeek-Coder-V2技术深度解析:如何实现开源代码智能的突破性性能
  • C语言基础入门到进阶:变量、函数、指针与内存管理一文讲透
  • 3串锂电池保护芯片PW7126搭配四颗PW4406A构成6A方案
  • IOTA 学习笔记(十):交易与 PTB,可编程交易块怎么理解?
  • 别再让单例坑了你!深入理解Unity中MonoBehaviour单例的销毁时机与内存管理
  • 如何用Unlock-Music免费解锁音乐文件:浏览器端解密完整指南
  • 某汽车品牌自燃事件的危机公关全程
  • Honey Select 2终极汉化优化补丁:三步搞定完整游戏体验升级
  • Joy-Con Toolkit:5大核心功能解锁任天堂Switch手柄的隐藏潜力
  • OData V4.01 完整查询语法速查表
  • 从Macvlan到Ipvlan:在K8s和Docker里选对虚拟网络模式的避坑指南
  • 15|测试用例与代码映射:平台怎么知道哪个用例测过哪段代码?
  • 舆情监测数据的真实性困境
  • 告别盲操作!手把手教你用AutoSar Dcm配置UDS 0x31例程控制(附RID参数详解)
  • 如何用3步实现Elsevier投稿状态智能追踪:科研工作者的终极效率工具
  • 从游戏地形到有限元分析:Delaunay三角剖分在Unity与COMSOL中的高效应用与避坑指南
  • 别再只会用AT指令了!手把手教你用Python脚本自动化测试NB-IoT模块(附源码)
  • 基于555定时器的冰箱门报警器:从原理到实战的电子DIY指南
  • Apache Dolphinscheduler 3.0 日志刷屏别慌!用Arthas在线清理缓存实战(附完整命令)
  • Forza Mods AIO:基于内存注入的《极限竞速》游戏修改技术方案
  • 5分钟搞定BepInEx:Unity游戏插件框架终极安装指南
  • 基于Arduino与超声波传感器的互动圣诞树灯光系统制作指南
  • 基于Shelly 1与PIR传感器打造百元级智能安防灯全攻略
  • 机器人遥操作中的变阻抗控制与被动性保障:从示教学习到稳定交互
  • 把聊天锁进公司自己的保险柜
  • 终极指南:如何用XTDrone快速构建你的无人机仿真项目
  • C# WinForm与ASP.NET Web服务双向通信验证工程(含JSON/表单双模式)
  • Axure RP中文语言包终极指南:4阶段框架打造专业级原型设计体验