LZW 编码详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0H
a
aa<4H>
4b
ab
0H
b
ab<5H>
5b
bb
1H
b
bb<6H>
6b
bb
bb
7a
bba
6H
a
bba<7H>
8a
aa
aa
9b
aab
4H
b
Aab<8H>
10 b
bb
bb
LZW编码步骤
(12)输出S1中的字符串”b”在字串表中的索引1H
序号 输入数据 S1+S2 输出结果 S1
S2
生成新字符及索引
1 NULL
NULL 2H
NULL
2a
a
a
3a
aa
0H
a
aa<4H>
4b
ab
0H
b
ab<5H>
5b
bb
1H
b
bb<6H>
6b
bb
bb
7a
bba
6H
a
bba<7H>
8a
aa
aa
9b
aab
4H
b
Aab<8H>
10 b
bb
bb
11
6H
LZW编码步骤
(13)输出结束标志LZW_EOI的索引3H,编码完毕
序号 输入数据 S1+S2 输出结果 S1
生成新字符及索引
S2
1 NULL
NULL 2H
NULL
2a
a
a
3a
aa
0H
a
aa<4H>
4b
ab
0H
b
ab<5H>
5b
bb
1H
b
bb<6H>
6b
bb
bb
7a
bba
6H
a
bba<7H>
8a
aa
aa
9b
aab
4H
b
Aab<8H>
10 b
bb
bb
11
6H
解码步骤
1)读第一个编码code=2H,无输出 2)读code=0H,输出0H对应的 a,oldcode=code=0H 3)code=0H,输出0H对应的a,然后将 oldcode=0H所对应的字符串“a”加上 code=0H对应的字符串的第一个字 符”a”,即”aa”添加到字典中,其索引 为4H,同时oldcode=code=0H
序号 输入数据
S2
1 NULL 2a 3a 4b 5b 6b 7a 8a
S1+S2 输出结果
NULL 2H
a
aa
0H
ab
0H
bb
1H
bb
bba
6H
aa
S1 生成新字符及索引
NULL
a
a
aa<4H>
b
ab<5H>
b
bb<6H>
bb
a
bba<7H>
aa
LZW编码步骤
(10)读字符b赋给S2。S1+S2=”aab”不在字符串表中,
LZW压缩使用字典库查找方案。它读入待
压缩的数据并与一个字典库(库开始是空的) 中的字符串对比,如有匹配的字符串,则输出该 字符串数据在字典库中的位置索引,否则将该 字符串插入字典中。
LZW编码算法
步骤1:将词典初始化为包含所有可能的单字 字符,当前前缀P初始化为空。
步骤2:当前字符C:=字符流中的下一个字符。
StartN=0.8+0×(1.0-0.8)=0.8 EndN=0.8+0.4×(1.0-0.8)=0.88
为空 b
bb
d
bbd
此时已无 输入
输出结果 4H
0H 0H 1H 2H
7H 1H
BH 3H 5H
S1 NULL
a a
b
生成的新字符串及索引
S1+S2在字符表 中S1,+SS12=不S1在+S字2 符 表 S1a中+aS,2<S不61H=在>S2字=“符a” 表a中b ,<S71H=>S2=“b”
c
bc <8H>
6)读入code=4H,输出“aa”,然后将oldcode=6H 所对应的字符串“bb”加上code=4H对应的字符 串的第一个字符”a”,即”bba”添加到字典中, 其索引为7H,同时oldcode=code=4H
7)读入code=6H,输出“bb”,然后将oldcode=4H 所对应的字符串“aa”加上code=6H对应的字符 串的第一个字符”b”,即”aab”添加到字典中, 其索引为8H,同时oldcode=code=6H
序号 输入数据 S1+S2 输出结果 S1 生成新字符及索引
S2
1 NULL
NULL 2H
NULL
2a
a
a
3a
aa
0H
a
aa<4H>
4b
ab
0H
b
ab<5H>
5b
bb
1H
b
bb<6H>
6b
bb
bb
7a
bba
6H
a
bba<7H>
LZW编码步骤
(9)读字符a赋给S2。S1+S2=”aa”在字符串表中,则 S1= S1+S2=“aa”
序号 输入数据
S2
1 NULL 2a
S1+S2 输出结果
NULL 2H a
S1 生成新字符及索引
NULL a
LZW编码步骤
(4)读下一个字符a,将其赋给S2。判断S1+S2=”aa”不在 字符串表中,输出S1=“a”在字串表中的索引0H,并在字符 串表末尾为S1+S2=“aa”添加索引4H,且S1= S2=“a”
字符串 a b LZW_CLEAR LZW_EOI
索引 0H 1H 2H 3H
LZW编码步骤
(2)输出LZW_CLEAR在字串表中的索引2H
序号 输入数据
S2
1 NULL
S1+S2 输出结果 NULL 2H
S1 生成新字符及索引 NULL
LZW编码步骤
(3)从图像数据流中第一个字符开始,读取一个字符a, 将其赋给字符串变量S2。判断S1+S2=”a”在字符串表中, 则S1=S1+S2=“a”
1985年,美国人Welch将LZ压缩技术从概念发展到实用 阶段,简称LZW压缩技术。广泛用于图象压缩领域。
LZW(Lempel-Ziv & Welch)编码又称字串表编码, 属于一种无损编码,LZW编码与行程编码类似,也是对字 符串进行编码从而实现压缩,但它在编码的同时还生成了 特定字符串以及与之对应的索引字符串表。
8)读入code=3H,解码完毕。
解码过程
行号
1 2 3 4 5 6 7 8
输入数据 code 2H 0H 0H 1H 6H 4H 6H 3H
新串
aa ab bb bba aab
输出结果 oldcode 生成新字 符及索引
a
0H
a
0H aa<4H>
b
1H ab<5H>
bb
6H bb<6H>
aa
4H bba<7H>
采用算术编码每个符号的平均编码长度 可以为小数。
待编码的数据序列为“dacab”,信源中各符号出现的概 率依次为P(a)=0.4,P(b)=0.2,P(c)=0.2, P(d)=0.2。
数据序列中的各数据符号在区间[0, 1]内的间隔(赋 值范围)设定为:
a=[0, 0.4) b=[0.4, 0.6) c=[0.6, 0.8) d=[0.8, 1.0 ]
a
0H
b
1H
c
2H
d
3H
LZW_CLEAR
4H
LZW_EOI
5H
输入数据S2 S1+S2
NULL
NULL
a
a
aS1为NULL,故aa
aa不b输存出在结,果故为输a空出b abS不1=c存“在a”,故的输索出引bc0H S1=“a a”的索引c0aH
b
ab
S1+bS2结果已存abb
在,b故输出结果bb
序号 输入数据
S2
1 NULL 2a 3a
S1+S2 输出结果
NULL 2H
a
aa
0H
S1 生成新字符及索引
NULL
a
a
aa<4H>
LZW编码步骤
(5)读下一个字符b赋给S2。判断S1+S2=”ab”不在字符串 表中,输出S1=“a”在字串表中的索引0H,并在字符串表末 尾为S1+S2=“ab”添加索引5H,且S1= S2=“b”
序号 输入数据
S2
1 NULL 2a 3a 4b 5b
S1+S2 输出结果
NULL 2H
a
aa
0H
ab
0H
bb
1H
S1 生成新字符及索引
NULL
a
a
aa<4H>
b
ab<5H>
b
Bb<6H>
LZW编码步骤
(7)读字符b赋给S2。S1+S2=”bb”在字符串表中,则 S1= S1+S2=“bb” 。
序号 输入数据
S2
1 NULL 2a 3a 4b 5b 6b
S1+S2 输出结果
NULL 2H
a
aa
Leabharlann Baidu
0H
ab
0H
bb
1H
bb
S1 生成新字符及索引
NULL
a
a
aa<4H>
b
ab<5H>
b
bb<6H>
bb
LZW编码步骤
(8)读字符a赋给S2。S1+S2=”bba”不在字符串表中,输出 S1=“bb”在字串表中的索引6H,并在字符串表末尾为 S1+S2=“bba”添加索引7H,且S1= S2=“a”
4)读入code=1H,输出“b”,然后将 oldcode=0H所对应的字符串“a”加上 code=1H对应的字符串的第一个字符”b”, 即”ab”添加到字典中,其索引为5H,同 时oldcode=code=1H
5)读入code=6H,由于字典中不存在该索 引,将oldcode=1H所对应的字符串“b” 加上oldcode=1H对应的字符串的第一个 字符”b”,即”bb”添加到字典中,其索引 为6H,同时oldcode=code=6H
bb
6H aab<8H>
对LZW算法的分析
①由于LZW算法的关键是通过翻译表来实 现压缩的,而且每次找出的串是在表中最长的 串,然后对其进行编码,因此,如果我们设法 增加表中长串的数量,则压缩比也就越高,即 串越长,输出越少。
②串表中的每一个串均具有前缀特性,即: 如果Kx(K为一个串,x为一个字符)在串表中, 则字的前缀K一定在串表中(称之为前缀条件)。
输出S1=“aa”在字串表中的索引4H,并在字符串表末尾
为S1+S2=“aab”添加索引8H,且S1= S2=“b”
序号 输入数据 S1+S2 输出结果 S1
生成新字符及索引
S2
1 NULL
NULL 2H
NULL
2a
a
a
3a
aa
0H
a
aa<4H>
4b
ab
0H
b
ab<5H>
5b
bb
1H
b
bb<6H>
6b
a=[0, 0.4), b=[0.4, 0.6), c=[0.6, 0.8), d[0.8, 1.0)
StartN=StartB+LeftC×L EndN=StartB+RightC×L
输入d: 其初始间隔为[0.8, 1.0) 输入a: 其初始间隔为[0, 0.4)
“a”的取值范围应在前一 符号间隔[0.8, 1.0)的 [0, 0.4)子区间内
行程编码适合于对二值图像的编码,如果 图像是由很多块颜色或灰度相同的大面积区域 组成的,采用行程编码可以达到很大的压缩比。
通常,为了达到比较好的压缩效果,一般 不单独使用行程编码,而是和其他编码方法结合 使用。如:在JPEG中,就综合使用了行程编码以
及哈夫曼编码。
LZW编码
1977年,以色列人Lempel和Ziv共同提出了查找冗余字 和用符较短的符号标记替代冗余字符的概念,简称LZ压缩技术。
bb
bb
7a
bba
6H
a
bba<7H>
8a
aa
aa
9b
aab
4H
b
Aab<8H>
LZW编码步骤
(11)读字符b赋给S2。S1+S2=”bb”,在字符串表中,
则 S1= S1+S2=“b”
序号 输入数据 S1+S2 输出结果 S1
S2
生成新字符及索引
1 NULL
NULL 2H
NULL
2a
a
a
3a
aa
步骤3:判断P+C是否在词典中
(1)如果“是”,则用C扩展P,即让P:=P+ C (2)如果“否”,则
输出与当前前缀P相对应的码字; 将P+C添加到词典中; 令P:=C,现在的P仅包含一个字符C
步骤4:判断码字流中是否还有码字要译
(1)如果“是”,就返回到步骤2; (2)如果“否”
把代表当前前缀P的码字输出到码字流; 结束。
算术编码
是一种从整个符号序列出发,采用递推形式连续编码的方 法,与建立在符号和码字对应基础上的块码不同,在算术编 码中,源符号和码字间的一一对应关系并不存在。1个算术 码字要赋给整个信源符号码字,而每个码字本身确定了0和1 之间的1个实数区间。
算术编码
算术编码具体方法是将被编码的信源消息 表示成实数轴0-1之间的一个间隔,消息越 长,编码表示的间隔就越小,即这一间隔所 需的二进制位数就越多。
序号 输入数据
S2
1 NULL 2a 3a 4b
S1+S2 输出结果
NULL 2H
a
aa
0H
ab
0H
S1 生成新字符及索引
NULL a a b
aa<4H> ab<5H>
LZW编码步骤
(6)读下一个字符b赋给S2。S1+S2=”bb”不在字符串表中, 输出S1=“b”在字串表中的索引1H,并在字符串表末尾为 S1+S2=“bb”添加索引6H,且S1= S2=“b” 。
LZW编码举例
输入数据流: 位置 1 2
字符 A B
编码过程:
步骤
位置
1
1
2
2
3
3
4
4
5
6
6
34 BA
码字 1 2 3 4 5 6 7 8
567 BAB
词典 A B C AB BB BA
ABA ABAC
89 AC
输出
1 2 2 4 7 3
LZW编码实例 aabcabbbbd
初始化字符串表
字符串
索引
a
Sc1a+S<29在H>字符表
ab
中,S1=S1+S2
b
abb <AH>
b
bb <BH>
bb
输d 出S1的索 bbd <CH> 引3H
输出LZW_EOI 标志的索引
LZW编码步骤
设来源于二色系统的图像数据源 :aabbbaabb (1)根据图像中使用的颜色数初始化一个字符串表,
字符串表中的每个颜色对应一个索引。 在初始字符串表的LZW_CLEAR和LZW_EOI分别为字符表 初始化标志和编码结束标志。
相关文档
最新文档