无损压缩原理

来源:互联网 发布:对生活感到厌倦知乎 编辑:程序博客网 时间:2024/05/01 17:48


香农-范诺编码

最早阐述和实现这种编码的是Shannon(1948年)和Fano(1949年),因此被称为香农-范诺(Shannon-Fano)算法。这种方法采用从上到下的方法进行编码。首先按照符号出现的频度或概率排序,例如,A,B,C,D和E,如表1所示。然后使用递归方法分成两个部分,每一部分具有近似相同的次数,如图4-01所示。按照这种方法进行编码得到的总位数为91。压缩比约为1.3 : 1。
表1 Shannon-Fano算法举例表
符号
出现的次数(Pi)
log2(1/P)
分配的代码
需要的位数
A
15 (0.375)
1.4150
00
30
B
7 (0.175)
2.5145
01
14
C
7 (0.175)
2.5145
10
14
D
6 (0.150)
2.7369
110
18
E
5 (0.125)
3.0000
111
15

霍夫曼编码

霍夫曼(Huffman)在1952年提出了另一种编码方法,即从下到上的编码方法。现仍以一个具体的例子说明它的编码步骤:
1、初始化,根据符号概率的大小按由大到小顺序对符号进行排序,如表4-03和图4-02所示。
2、把概率最小的两个符号组成一个节点,如图4-02中的D和E组成节点P1。
3、重复步骤2,得到节点P2、P3和P4,形成一棵“树”,其中的P4称为根节点。
4、从根节点P4开始到相应于每个符号的“树叶”,从上到下标上“0”(上枝)或者“1”(下枝),至于哪个为“1”哪个为“0”则无关紧要,最后的结果仅仅是分配的代码不同,而代码的平均长度是相同的。
5、从根节点P4开始顺着树枝到每个叶子分别写出每个符号的代码,如表2所示。
6、按照仙农理论,这幅图像的熵为
H(S)=(15/39)´ log2(39/15) + (7/39)´ log2(39/7) + ž ž ž + (5/39)´ log2(39/5)= 2.1859log2压缩比1.37:1。
表2 霍夫曼编码举例
符号
出现的次数
log2(1/pi)
分配的代码
需要的位数
A
15(0.3846)
1.38
0
15
B
7(0.1795)
2.48
100
21
C
6(0.1538)
2.70
101
18
D
6(0.1538)
2.70
110
18
E
5(0.1282)
2.96
111
15
霍夫曼码的码长虽然是可变的,但却不需要另外附加同步代码。例如,码串中的第1位为0,那末肯定是符号A,因为表示其他符号的代码没有一个是以0开始的,因此下一位就表示下一个符号代码的第1位。同样,如果出现“110”,那么它就代表符号D。如果事先编写出一本解释各种代码意义的“词典”,即码簿,那么就可以根据码簿一个码一个码地依次进行译码。

算术编码

算术编码在图像数据压缩标准(如JPEG,JBIG)中扮演了重要的角色。在算术编码中,消息用0到1之间的实数进行编码,算术编码用到两个基本的参数:符号的概率和它的编码间隔。信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在0到1之间。编码过程中的间隔决定了符号压缩后的输出。

RLE编码

现实中有许多这样的图像,在一幅图像中具有许多颜色相同的图块。在这些图块中,许多行上都具有相同的颜色,或者在一行上有许多连续的象素都具有相同的颜色值。在这种情况下就不需要存储每一个象素的颜色值,而仅仅存储一个象素的颜色值,以及具有相同颜色的象素数目就可以,或者存储一个象素的颜色值,以及具有相同颜色值的行数。这种压缩编码称为行程编码,常用(run length encoding,RLE)表示,具有相同颜色并且是连续的象素数目称为行程长度。

词典编码

词典编码(dictionary encoding)的根据是数据本身包含有重复代码这个特性。例如文本文件和光栅图像就具有这种特性。词典编码法的种类很多,归纳起来大致有两类。
第一类词典法的想法是企图查找正在压缩的字符序列是否在以前输入的数据中出现过,然后用已经出现过的字符串替代重复的部分,它的输出仅仅是指向早期出现过的字符串的“指针”。这里所指的“词典”是指用以前处理过的数据来表示编码过程中遇到的重复部分。这类编码中的所有算法都是以Abraham LempelJakob Ziv在1977年开发和发表的称为LZ77算法为基础的,例如1982年由Storer和Szymanski改进的称为LZSS算法就是属于这种情况。
第二类算法的想法是企图从输入的数据中创建一个“短语词典(dictionary of the phrases)”,这种短语不一定是像“严谨勤奋求实创新”和“国泰民安是坐稳总统宝座的根本”这类具有具体含义的短语,它可以是任意字符的组合。编码数据过程中当遇到已经在词典中出现的“短语”时,编码器就输出这个词典中的短语的“索引号”,而不是短语本身。


据我所知还有一种叫做游程编码的压缩方式,但是有局限性,但游程很短,01变化很快时,并不高效。
0 0