记录研究生封校生活的学习day14(第二篇)图像的算数编码(干货,纯理论)

248 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

总计:今天是十月更文计划第十三天,第二十八篇

图像的算数编码

这一篇学习图像的算数编码

算术编码把要压缩处理的整段数据映射射到一段实数半开区间[0,1)内的某一段,构造出小于1且大于或等于0的数值。这个数值是输入数据流的唯一可译码。

例:对一个5符号信源A={a2a3a1a3a4},各符号出现的概率和设定的取值范围如下:

        字符       概率         范围
           a1           0.2       [0.0,  0.2)
           a2           0.2       [0.2,  0.4)
           a3           0.4       [0.4,  0.8)
           a4           0.2        [0.8,  1.0)

“范围”给出了符号的赋值区间。这个区间是根据符号发生的概率划分的。具体把a1、a2、a3、a4分配在哪个区间范围,对编码本身没有影响,只要保证编码器和解码器对符号的概率区间有相同的定义即可。

1、若数据流的第一个符号为a2,由符号概率取值区间的定义可知,代码的实际取值范围在[0.2, 0.4)之间。

2、读入第二个符号a3取值范围在区间的[0.4,0.8)内。但需要说明的是由于第一个符号a2已将取值区间限制在[0.2, 0.4)的范围中,因此,a3的实际取值是在前符号范围[0.2, 0.4)的[0.4, 0.8)处。

将[0.2,0.4)扩充为整个字符串的取值区间,第二个字符占据的取值空间是[0.2,0.4)范围内的[0.4,0.8)部分,即[0.28,0.36)。0.28=0.2+(0.4-0.2)*0.4;0.36=0.2+(0.4-0.2)*0.8;

3、第三个字符a1是在前两个字符a2a3的基础上得到的,因此,它应按a1的概率对[0.28,0.36)进行再一步细分,即[0.28,0.36)的[0.0,0.2)部分,得到新的区间[0.28,0.296)。0.28=0.28+(0.36-0.28)*0.0;0.296=0.28+ (0.36-0.28)*0.2

4、第四个字符a3的取值空间[0.2864,0.2928);最后一个字符a4的取值空间为[0.29152,0.2928)。

每输入一个符号,都将按事先对概率范围的定义,在逐步缩小的当前取值区间上,按式(5.1)和(5.2)式确定新的范围上、下限。重复上述编码过程,直到输入数据流结束。

所以 对于最开始的表格来说:

字符 区间长度 范围
a2 0.2 [0.2, 0.4)

a3 0.08 [0.28, 0.36)

a1 0.016 [0.28, 0.296)

a3 0.0064 [0.2864, 0.2928)

a4 0.0013 [0.2915, 0.2928]

随着符号的输入,代码的取值范围越来越小。当字符串A={a2a3a1a3a4}被全部编码后,其范围在[0.2915, 0.2928]内。

在此范围内的数据代码都唯一对应于符号串“a2a3a1a3a4”。可取这个区间的下限 0.2915 作为对源数据流“a2a3a1a3a4”进行压缩编码后的输出代码,这样,就可以用一个浮点数表示一个符号串,达到减少所需存储空间的目的。

若为减少码长,可用0.292表示,这样三位十进制数字表示五个符号的消息,其平均码长为0.6个十进制数字/符号,而信源熵为0.58个十进制数字/符号,十分接近无噪声信源编码定理所设定的理论极限。

编码序列的长度越长,算术编码就越接近无噪声编码定理所设定的理论极限。但是在实际上有两个因素使编码效率无法达到这个极限值:①为了将各个消息分开,必须增加消息结束指示符;②使用的算法精度是有限的。

根据编码时所使用的字符概率区间分配表和压缩后的数值代码所在的范围,可以很容易地确定代码所对应的第一个字符。在完成对第一个符号的解码后,设法去掉第一个符号对区间的影响,再使用相同的方法找到下一个符号。重复以上的操作,直到完成解码过程。