数字图像算术编码python_算术编码简介

本文详细介绍了算术编码的原理,通过实例展示了如何对字符进行编码,对比了算术编码与哈夫曼编码的异同,并探讨了它们在熵编码中的本质。此外,还提及了算术编码在编程实现时面临的挑战及其优势。
摘要由CSDN通过智能技术生成

上一篇讲了LZW编码,本篇讨论另一种不同的编码算法,算数编码。和哈夫曼编码一样,算数编码是熵编码的一种,是基于数据中字符出现的概率,给不同字符以不同的编码。本文也会对这两种编码方式的相似和不同点进行比较。

编码原理

算数编码的原理我个人感觉其实并不太容易用三言两语直观地表达出来,其背后的数学思想则更是深刻。当然在这里我还是尽可能地将它表述,并着重结合例子来详细讲解它的原理。

简单来说,算数编码做了这样一件事情:

假设有一段数据需要编码,统计里面所有的字符和出现的次数。

将区间 [0,1) 连续划分成多个子区间,每个子区间代表一个上述字符, 区间的大小正比于这个字符在文中出现的概率 p。概率越大,则区间越大。所有的子区间加起来正好是 [0,1)。

编码从一个初始区间 [0,1) 开始,设置:low = 0,high = 1low=0,high=1

不断读入原始数据的字符,找到这个字符所在的区间,比如 [ L, H ),更新:

low = low + (high - low) * L \\\ high = low + (high - low) * Hlow=low+(high−low)∗Lhigh=low+(high−low)∗H

最后将得到的区间 [low, high)中任意一个小数以二进制形式输出即得到编码的数据。

乍一看这些数学和公式很难给人直观理解,所以我们还是看例子。例如有一段非常简单的原始数据:

ARBER

统计它们出现的次数和概率:

SymbolTimesP

A

1

0.2

B

1

0.2

E

1

0.2

R

2

0.4

将这几个字符的区间在 [0,1) 上按照概率大小连续一字排开,我们得到一个划分好的 [0,1)区间:

bVWFbA?w=341&h=91

e931a28289a8fc50e5fbdc513941b66c.png

开始编码,初始区间是 [0,1)。注意这里又用了区间这个词,不过这个区间不同于上面代表各个字符的概率区间 [0,1)。这里我们可以称之为编码区间,这个区间是会变化的,确切来说是不断变小。我们将编码过程用下图完整地表示出来:

bVWFcv?w=515&h=287

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值