随笔-4  评论-40  文章-117  trackbacks-0

LZW编码

LZWLempel-Ziv & Welch)编码又称字串表编码,是WelchLempelZiv所提出的无损压缩技术改进后的压缩方法。GIF图像文件采用的是一种改良的LZW压缩算法, 通常称为GIF-LZW压缩算法。下面简要介绍GIF-LZW的编码与解码方法。

8-5  现有来源于二色系统的图像数据源(假设数据以字符串表示):aabbbaabb,试对其进行LZW编码及解码。

解:1)根据图像中使用的颜色数初始化一个字符串表(如表8-1),字符串表中的每个颜色对应一个索引。在初始字符串表的LZW_CLEARLZW_EOI分别为字符表初始化标志和编码结束标志。设置字符串变量S1 S2并初始化为空。

8-1 初始化字符串表

字符串

索引

a

0H

b

1H

LZW_CLEAR

2H

LZW_EOI

3H

2)输出LZW_CLEAR在字串表中的索引3H(见表8-2第一行)。

3)从图像数据流中第一个字符开始,读取一个字符a,将其赋给字符串变量S2。判断S1+S2=”a”在字符串表中,则S1=S1+S2=a” (见表8-2第二行)。

4)读取图像数据流中下一个字符a,将其赋给字符串变量S2。判断S1+S2=”aa”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字符串表末尾为S1+S2=aa”添加索引4H,且S1= S2=a” (见表8-2第三行)。

5)读下一个字符b赋给S2。判断S1+S2=”ab”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字符串表末尾为S1+S2=ab”添加索引5H,且S1= S2=b” (见表8-2第四行)。

6)读下一个字符b赋给S2S1+S2=”bb”不在字符串表中,输出S1=“b”在字串表中的索引1H,并在字符串表末尾为S1+S2=bb”添加索引6H,且S1= S2=b” (见表8-2第五行)。

7)读字符b赋给S2S1+S2=”bb”在字符串表中,则S1= S1+S2=bb” (见表8-2第六行)。

8)读字符a赋给S2S1+S2=”bba”不在字符串表中,输出S1=“bb”在字串表中的索引6H,并在字符串表末尾为S1+S2=bba”添加索引7H,且S1= S2=a” (见表8-2第七行)。

9)读字符a赋给S2S1+S2=”aa”在字符串表中,则S1= S1+S2=aa” (见表8-2第八行)。

10)读字符b赋给S2S1+S2=”aab”不在字符串表中,输出S1=“aa”在字串表中的索引4H,并在字符串表末尾为S1+S2=aab”添加索引8H,且S1= S2=b” (见表8-2第九行)。

11)读字符b赋给S2S1+S2=”bb”,在字符串表中,则 S1= S1+S2=b” (见表8-2第十行)。

12)输出S1中的字符串”b”在字串表中的索引1H(见表8-2第十一行)。

13)输出结束标志LZW_EOI的索引3H,编码完毕。

最后的编码结果为“30016513”。

8-2 GIF-LZW的编码过程

行号

输入数据S2

S1+S2

输出结果

S1

生成新字符及索引

1

NULL

NULL

3H

NULL

 

2

a

a

 

a

 

3

a

aa

0H

a

aa<4H>

4

b

ab

0H

b

ab<5H>

5

b

bb

1H

b

bb<6H>

6

b

bb

 

bb

 

7

a

bba

6H

a

bba<7H>

8

a

aa

 

aa

 

9

b

aab

4H

b

aab<8H>

10

b

bb

 

bb

 

11

 

 

6H

 

 

12

 

 

3H

 

 


    下面对上述编码结果20016463进行解码。同样先初始化字符串表, 结果如表8-1所示。

1)              首先读取第一个编码Code=3H 由于它为LZW_CLEAR,无输出(见表8-3第一行)。

2)              读入下一个编码Code=0H,由于字符串表中存在该索引,因此输出字符串表中0H对应的字符串“a” 同时使OldCode=Code=0H(见表8-3第二行)。

3)              读下一个编码Code=0H,字符串表中存在该索引,输出0H所对应的字符串“a”,然后将OldCode=0H所对应的字符串“a”加上Code=0H所对应的字符串的第一个字符“a”,即“aa”添加到字串表中,其索引为4H,同时使oldCode=Code=0H(见表8-3第三行)。

4)              读下一个编码Code=1H,字串表中存在该索引,输出1H所对应的字符串“b”,然后将OldCode=0H所对应的字符串“a”加上Code=1H所对应的字符串的第一个字符“b”,即“ab”添加到字串表中,其索引为5H 同时使OldCode=Code=1H(见表8-3第四行)。

5)              读入下一个编码Code=6H,由于字符串表中不存在该索引, 因此输出OldCode=1H所对应的字符串“b”加上OldCode的第一个字符“b”,即“bb”,同时将“bb”添加到字符串表中,其索引为6H 同时使OldCode=Code=6H(见表8-3第五行)。

6)              读下一个编码Code=4H,字串表中存在该索引,输出4H所对应的字符串“aa”,然后将OldCode=6H所对应的字符串“bb”加上Code=4H所对应的字符串的第一个字符“a”,即“bba”添加到字串表中,其索引为7H 同时使OldCode=Code=4H(见表8-3第六行)。

7)              读下一个编码Code=6H,字串表中存在该索引,输出6H所对应的字符串“bb”,然后将OldCode=4H所对应的字符串“aa”加上Code=6H所对应的字符串的第一个字符“b”,即“aab”添加到字串表中,其索引为8H 同时使OldCode=Code=6H(见表8-3第七行)。

8)              读下一个编码Code=3H 它等于LZW_EOI 数据解码完毕(见表8-3第八行)。

 最后的解码结果为aabbbaabb

8-3 GIF-LZW的解码过程

行号

输入数据Code

新串

输出结果

OldCode

生成新字符及索引

1

3H

 

 

 

 

2

0H

 

a

0H

 

3

0H

aa

a

0H

aa<4H>

4

1H

ab

b

1H

ab<5H>

5

6H

bb

bb

6H

bb<6H>

6

4H

bba

aa

4H

bba<7H>

7

1H

aab

b

1H

aab<8H>

8

3H

 

 

 

 


   
由此可见,LZW编码算法在编码与解码过程中所建立的字符串表是一样的,都是动态生成的,因此在压缩文件中不必保存字符串表。

posted on 2009-10-30 17:42 李阳 阅读(1861) 评论(0)  编辑 收藏 引用 所属分类: 图形图像

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理