算术编码 | 学习笔记

简介: 快速学习算术编码,介绍了算术编码系统机制, 以及在实际应用过程中如何使用。

开发者学堂课程【高校精品课-华中科技大学 -智能媒体计算算术编码】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/811/detail/15684


算术编码


内容介绍:

一、算数编码思想

二、算数编码过程举例

三、算术编码需要注意的几个问题


一、算数编码思想

1. 算术编码在图像数据压缩标准(如 JPEG)中扮演了重要的角色

在图像压缩中只用一个实数表示,用0和1中的一个小数表示信源的符号,例如颜色值或者声音的样本

其可以大幅度的压缩数据量,所以使用算数编码的压缩比很高

2.在算术编码中,消息用0到1之间的实数进行编码,算术编码用到两个基本的参数

(1)符号概率

(2)编码间隔

3.注意

编码的间隔取决于符号概率。


二、算数编码过程举例

例1:

假设信源符号为{00,01,10,11},这些符号的概率分别为{0.1,0.4,0.2,0.3 }

根据这些概率可把间隔[0,1)分成4个子间隔:

[0,0.1)∶间隔为0.1

[0.1,0.5)∶间隔为0.4

[0.5,0.7)∶间隔为0.2

[0.7,1):间隔为0.3

区间的间隔是概率值,可以用两个二进制表示,算数编码是用编码间隔去找到0到1之间的数。

先按照间隔将其分为4份,信源符号、概率和初始编码间隔的表格如下:

符号

概率

初始编码

00

0.1

[0,0.1)

01

0.4

[0.1,0.5)

10

0.2

[0.5,0.7)

11

0.3

[0.7,1)

间隔图如下:

image.png

第一个符号为10

[0.5,0.7)是10,将[0.5,0.7)作为一个整体,将该区间进行分割,等比例的划分成4个区间,计算时可以将其分为10份。0.5到0.7的间隔是0.2,除以10为0.02,前面第一个编码空间占1份,也就是0.5到0.52,依此类推,可以把这4个区间开始和结束的值计算出来.

第二个符号为00

00位于该区间的第一段,区间为0.5到0.52,可以再将该区间等比例划分为4个。

第三个符号为11

区间为0.514到0.52,继续输入符号00,然后等比例分割,区间为0.5146到0.514。继续输入符号10,是从下面开始数的第三个子区间,然后等比例放大,区间为0.51442到0.5143.下一个为11,继续等比例分割,区间就为0.514384到0.51442。下一个符号为01,继续等比例分割,区间为0.5143876到0.514402.

假设将所有数编完了,输出的数,就是把该空间的上下两个数选择一个,通常选下面的这个为0.5143876作为前面编码的算数编码。

如下图:

image.png

也就是输入10 00 11 00 10 11 01用小数0.5143876表示。

如果还要输入,则继续按照前面的分割,结果是越后编码的数量越多,小数点后的位数越长。在 不影响区间的情况下可以适当的进行四舍五入,但是不能改变区间。

算数解码过程如下表格:

步骤

间隔

译码符号

译码判决

1

[0.5,0.7)

10

0.51439在间隔[0.5,0.7)

2

[0.5,0.52)

00

0.51439在间隔[0.5,0.7)的第1个1/10

3

[0.514,0.52)

11

0.51439在间隔[0.5,0.52)的第7个1/10

4

[0.514,0.5146)

00

0.51439在间隔[0.514,0.52)的第1个1/10

5

[0.5143,0.51442)

10

0.51439在间隔[0.514,0.5146)的第5个1/10

6

[0.514384,0.51442)

11

0.51439在间隔[0.5143,0.51442)的第7个1/10

7

[0.51439,0.5143948)

01

0.51439在间隔[0.51439,0.5143948)的第1个1/10

8

译码的消息:10 00 11 00 10 11 01

所以译码的过程是编码的过程反过来。


三、算术编码需要注意的几个问题

1. 由于实际的计算机精度不可能无限长,运算中会出现溢出问题

(1)多数机器都有16位、32位或者64位的精度

(2)可使用比例缩放方法解决

(目前多数计算机都有16位、32位,普遍都是64位,所以很大程度上避免了溢出出现的概率,但是将8k的图像整个的用算数编码编是不可能的,算数编码是把一幅图像划分一小块一小块的,例如8*8,现在变成了4*4的,甚至还有2*2的小块,2*2也就是4个像素,8*8也就是64个像素,随着小块的数量是有限的,溢出的问题会得到很好的解决)

还可以通过比例的缩放来解决溢出的问题,但是溢出本身从算数编码的方法来说是存在的。

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

(1)一种对错误很敏感的编码方法(这时需要加一些错误保护)

(2)如果有一位发生错误就会导致整个消息译错

相关文章
|
存储 机器学习/深度学习 人工智能
大模型时代的存储趋势
从2022年下半年,大模型和AIGC这两个词变得极其火热,而GPU的市场也是一卡难求。对于这种迷乱和火热,让我想起了当年的比特币挖矿和IPFS。似乎世界一年一个新风口,比特币、元宇宙、NFT、AIGC,金钱永不眠,IT炒作永不停歇。 每一个新的风口出现,总有两拨势力在冲突,保守派不断探索业务的真实价值,通过价值投资试图证明这又是一个新的庞氏骗局;另一波则是来势汹汹,集结一切可团结的力量,证明新时代已经来临。对于这一个个的风口,AIGC和大模型似乎与前几年的风口不一样,让我们看到了一丝真正的未来科技,在这篇文章,我会分享我对大模型&AIGC的看法,以及从存储的视角思索,在大模型时代存储的趋势。
|
IDE 搜索推荐 编译器
使用esp8266使用小爱同学实现开灯与关灯操作
使用esp8266使用小爱同学实现开灯与关灯操作
414 0
|
机器学习/深度学习 人工智能 自然语言处理
一文搞懂【知识蒸馏】【Knowledge Distillation】算法原理
一文搞懂【知识蒸馏】【Knowledge Distillation】算法原理
一文搞懂【知识蒸馏】【Knowledge Distillation】算法原理
|
Ubuntu Linux 开发工具
Linux下的IMX6ULL——环境搭建与软件安装(一)
Linux下的IMX6ULL——环境搭建与软件安装(一)
497 0
Linux下的IMX6ULL——环境搭建与软件安装(一)
|
Docker 容器
Docker学习笔记三:如何运行一个容器?
Docker学习笔记三:如何运行一个容器?
553 0
Docker学习笔记三:如何运行一个容器?
|
8月前
|
SQL 存储 Apache
基于 Flink 进行增量批计算的探索与实践
本文整理自阿里云高级技术专家、Apache Flink PMC朱翥老师在Flink Forward Asia 2024的分享,内容分为三部分:背景介绍、工作介绍和总结展望。首先介绍了增量计算的定义及其与批计算、流计算的区别,阐述了增量计算的优势及典型需求场景,并解释了为何选择Flink进行增量计算。其次,详细描述了当前的工作进展,包括增量计算流程、执行计划生成、控制消费数据量级及执行进度记录恢复等关键技术点。最后,展示了增量计算的简单示例、性能测评结果,并对未来工作进行了规划。
895 6
基于 Flink 进行增量批计算的探索与实践
|
存储 SQL 人工智能
【云栖实录】Hologres3.0全新升级:一体化实时湖仓平台
2024年云栖大会,Hologres 3.0全新升级为一体化实时湖仓平台,通过统一数据平台实现湖仓存储一体、多模式计算一体、分析服务一体、Data+AI 一体,发布 Dynamic Table、External Database、分时弹性、Query Queue、NL2SQL 等众多新的产品能力,实现一份数据、一份计算、一份服务,极大提高数据开发及应用效率。同时,Hologres 的预付费实例年付折扣再降15%,仅需7折,不断帮助企业降低数据管理成本,赋能业务增长。
|
编解码 UED
音视频同步的方法:深入探索基于FFmpeg的音视频同步策略(一)
音视频同步的方法:深入探索基于FFmpeg的音视频同步策略
1673 1
|
数据采集 监控 安全
LabVIEW控制步进电机如何应用于自动化设备中?
LabVIEW控制步进电机如何应用于自动化设备中?
206 0
|
存储 算法 Linux
使用 bzip2 进行文件压缩和解压缩
`bzip2` 是 Linux 中用于压缩和解压缩的命令,提供比传统方法更好的压缩效果。要压缩文件,使用 `bzip2 filename`(-k 保留原文件),解压缩则用 `bzip2 -d` 或 `bunzip2`。`bzcat` 或 `bzip2 -dc` 可查看压缩文件内容。`-1` 到 `-9` 选项可调整压缩级别(默认为 6)。注意备份重要文件,处理大文件时检查磁盘空间。