LZW-编码详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(10)读字符b赋给S2。S1+S2=”aab”不在字符串表中, 输出S1=“aa”在字串表中的索引4H,并在字符串表末尾 为S1+S2=“aab”添加索引8H,且S1= S2=“b”
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
LZW编码步骤
(4)读下一个字符a,将其赋给S2。判断S1+S2=”aa”不在 字符串表中,输出S1=“a”在字串表中的索引0H,并在字符 串表末尾为S1+S2=“aa”添加索引4H,且S1= S2=“a”
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
4 5
a
b b
aa
ab bb
0H
0H 1H
a
b b
aa<4H>
ab<5H> bb<6H>
6
b
bb
bb
LZW编码步骤
(8)读字符a赋给S2。S1+S2=”bba”不在字符串表中,输出 S1=“bb”在字串表中的索引6H,并在字符串表末尾为 S1+S2=“bba”添加索引7H,且S1= S2=“a”
解码过程
行号 1 2 输入数据 code 2H 0H a 0H 新串 输出结果 oldcode 生成新字 符及索引
3
4 5
0H
1H 6H
aa
ab bb
a
b bb
0H
1H 6H
aa<4H>
ab<5H> bb<6H>
6
7 8
4H
6H 3H
bba
aab
aa
bb
4H
6H
bba<7H>
aab<8H>
对LZW算法的分析
①由于LZW算法的关键是通过翻译表来实 现压缩的,而且每次找出的串是在表中最长的 串,然后对其进行编码,因此,如果我们设法 增加表中长串的数量,则压缩比也就越高,即 串越长,输出越少。
②串表中的每一个串均具有前缀特性,即: 如果Kx(K为一个串,x为一个字符)在串表中, 则字的前缀K一定在串表中(称之为前缀条件)。
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
4
a
b
aa
ab
0H
0H
a
b
aa<4H>
ab<5H>
LZW编码步骤
(6)读下一个字符b赋给S2。S1+S2=”bb”不在字符串表中, 输出S1=“b”在字串表中的索引1H,并在字符串表末尾为 S1+S2=“bb”添加索引6H,且S1= S2=“b” 。
NULL
a a b
NULL
a aa ab
2H
0H 0H
NULL
a a b aa<4H> ab<5H>
5
6 7
b
b a
bb
bb bba
1H
6H 4H 6H 3H
b
bb a
bb<6H>
bba<7H> Aab<8H>
8
9 10 11 12
a
b b
aa
aab bb
aa
b bb
解码步骤
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
字符串 索引
a b
c d LZW_CLEAR LZW_EOI
0H 1H
2H 3H 4H 5H
输入数据S2 NULL
S1+S2 NULL
a a aS1为NULL,故 aa 输出结果为空 b ab aa不存在,故输出 c bc S1=“a”的索引 ab 不存在,故输出 0H a ca S1=“a”的索引 0H b ab b 结果已存 abb S1+S2 在,b 故输出结果 bb 为空 bb b d 此时已无 输入 bbd
序号 输入数据S2 S1+S2 1 2 3 4 NULL a a b NULL a aa ab 0H 0H 输出结果 2H S1 NULL a a b aa<4H> ab<5H> 生成新字符及索引
5
6 7
b
b a
bb
bb bba
1H
6H
b
bห้องสมุดไป่ตู้ a
bb<6H>
bba<7H>
LZW编码步骤
(9)读字符a赋给S2。S1+S2=”aa”在字符串表中,则 S1= S1+S2=“aa”
输出结果 S1 生成的新字符串及索引 4H NULL S1+S2在字符表 中 ,S1=S1+S2 a S1+S2 不在字符 a 表中,S1=S2=“a” aa <6H> 0H S1+S2 不在字符 表中,S1=S2=“b” 0H b ab <7H>
1H 2H 7H 1H
BH
c a
ab b
bc <8H> ca <9H> S1+S2 在字符表
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
4 5
a
b b
aa
ab bb
0H
0H 1H
a
b b
aa<4H>
ab<5H> Bb<6H>
LZW编码步骤
(7)读字符b赋给S2。S1+S2=”bb”在字符串表中,则 S1= S1+S2=“bb” 。
LZW编码
和用较短的符号标记替代冗余字符的概念,简称LZ压缩 技术。 1985年,美国人Welch将LZ压缩技术从概念发展到实用 阶段,简称LZW压缩技术。广泛用于图象压缩领域。 LZW(Lempel-Ziv & Welch)编码又称字串表编码, 属于一种无损编码,LZW编码与行程编码类似,也是对字 符串进行编码从而实现压缩,但它在编码的同时还生成 了特定字符串以及与之对应的索引字符串表。
3
4 5
a
b b
aa
ab bb
0H
0H 1H 6H 4H
a
b b
aa<4H>
ab<5H> bb<6H> bba<7H> Aab<8H>
6
7 8 9
b
a a b
bb
bba aa aab
bb
a aa b
LZW编码步骤 (11)读字符b赋给S2。S1+S2=”bb”,在字符串表中, 则 S1= S1+S2=“b”
算 术 编 码
是一种从整个符号序列出发,采用递推形式连续编码的
方法,与建立在符号和码字对应基础上的块码不同,在算术
编码中,源符号和码字间的一一对应关系并不存在。1 个算 术码字要赋给整个信源符号码字,而每个码字本身确定了 0
和1之间的1个实数区间。
算 术 编 码
算术编码具体方法是将被编码的信源消息 表示成实数轴0-1之间的一个间隔,消息越 长,编码表示的间隔就越小,即这一间隔所 需的二进制位数就越多。 采用算术编码每个符号的平均编码长度 可以为小数。
字符串 a b LZW_CLEAR 索引 0H 1H 2H
LZW_EOI
3H
LZW编码步骤
(2)输出LZW_CLEAR在字串表中的索引2H
序号 输入数据S2 S1+S2 1 NULL NULL 输出结果 2H S1 NULL 生成新字符及索引
LZW编码步骤
(3)从图像数据流中第一个字符开始,读取一个字符a, 将其赋给字符串变量S2。判断S1+S2=”a”在字符串表中, 则S1=S1+S2=“a”
LZW编码
行程编码适合于对二值图像的编码,如果 图像是由很多块颜色或灰度相同的大面积区域 组成的,采用行程编码可以达到很大的压缩比。
通常,为了达到比较好的压缩效果,一般 不单独使用行程编码,而是和其他编码方法结合 使用。如:在JPEG中,就综合使用了行程编码以 及哈夫曼编码。
1977年,以色列人Lempel和Ziv共同提出了查找冗余字符
序号 输入数据S2 S1+S2 1 2 3 4 5 NULL a a b b NULL a aa ab bb 0H 0H 1H 6H 4H 输出结果 2H S1 NULL a a b b aa<4H> ab<5H> bb<6H> bba<7H> Aab<8H> 生成新字符及索引
6
7 8 9 10
b
a a b b
步骤3:判断P+C是否在词典中 (1)如果“是”,则用C扩展P,即让P:=P+C (2)如果“否”,则 输出与当前前缀P相对应的码字; 将P+C添加到词典中; 令P:=C,现在的P仅包含一个字符C
步骤4:判断码字流中是否还有码字要译 (1)如果“是”,就返回到步骤2;
(2)如果“否” 把代表当前前缀P的码字输出到码字流; 结束。
序号 输入数据S2 S1+S2 1 2 3 4 NULL a a b NULL a aa ab 0H 0H 输出结果 2H S1 NULL a a b aa<4H> ab<5H> 生成新字符及索引
5
6 7
b
b a
bb
bb bba
1H
6H
b
bb a
bb<6H>
bba<7H>
8
a
aa
aa
LZW编码步骤
LZW编码举例
输入数据流: 位置 1
字符 A 2 B 3 B 4 A 5 B 词典 A B C AB BB 1 2 6 A 7 B 8 A 9 C
编码过程:
步骤 位置 码字 1 2 3 1 2 1 2 4 5 输出
3
4 5 6
3
4 6
6
7 8
BA
ABA ABAC
2
4 7 3
LZW编码实例
aabcabbbbd 初始化字符串表
bb
bba aa aab bb
bb
a aa b bb
LZW编码步骤
(12)输出S1中的字符串”b”在字串表中的索引1H
序号 输入数据S2 S1+S2 输出结果 S1 生成新字符及索引
1
2 3 4 5 6 7
NULL
a a b b b a
NULL
a aa ab bb bb bba
2H
0H 0H 1H 6H 4H
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
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
a
aa
0H
a
aa<4H>
LZW编码步骤
(5)读下一个字符b赋给S2。判断S1+S2=”ab”不在字符串 表中,输出S1=“a”在字串表中的索引0H,并在字符串表末 尾为S1+S2=“ab”添加索引5H,且S1= S2=“b”
中,S1=S1+S2
abb <AH> bb <BH>
b bb
3H 5H
d S1的索 bbd <CH> 输出 引3H
输出LZW_EOI 标志的索引
LZW编码步骤
设来源于二色系统的图像数据源 :aabbbaabb (1)根据图像中使用的颜色数初始化一个字符串表, 字符串表中的每个颜色对应一个索引。 在初始字符串表的LZW_CLEAR和LZW_EOI分别为字符表 初始化标志和编码结束标志。
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 8)读入code=3H,解码完毕。
待编码的数据序列为“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 ]
LZW压缩使用字典库查找方案。它读入待
压缩的数据并与一个字典库(库开始是空的) 中 的字符串对比,如有匹配的字符串,则输出该
字符串数据在字典库中的位置索引,否则将该 字符串插入字典中。
LZW编码算法
步骤1:将词典初始化为包含所有可能的单字 字符,当前前缀P初始化为空。 步骤2:当前字符C:=字符流中的下一个字符。
NULL
a a b b bb a bba<7H> Aab<8H> aa<4H> ab<5H> bb<6H>
8
9 10
a
b b
aa
aab bb
aa
b bb
11
6H
LZW编码步骤 (13)输出结束标志LZW_EOI的索引3H,编码完毕
序号 输入数据S2 S1+S2 输出结果 S1 生成新字符及索引
1
2 3 4
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
LZW编码步骤
(4)读下一个字符a,将其赋给S2。判断S1+S2=”aa”不在 字符串表中,输出S1=“a”在字串表中的索引0H,并在字符 串表末尾为S1+S2=“aa”添加索引4H,且S1= S2=“a”
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
4 5
a
b b
aa
ab bb
0H
0H 1H
a
b b
aa<4H>
ab<5H> bb<6H>
6
b
bb
bb
LZW编码步骤
(8)读字符a赋给S2。S1+S2=”bba”不在字符串表中,输出 S1=“bb”在字串表中的索引6H,并在字符串表末尾为 S1+S2=“bba”添加索引7H,且S1= S2=“a”
解码过程
行号 1 2 输入数据 code 2H 0H a 0H 新串 输出结果 oldcode 生成新字 符及索引
3
4 5
0H
1H 6H
aa
ab bb
a
b bb
0H
1H 6H
aa<4H>
ab<5H> bb<6H>
6
7 8
4H
6H 3H
bba
aab
aa
bb
4H
6H
bba<7H>
aab<8H>
对LZW算法的分析
①由于LZW算法的关键是通过翻译表来实 现压缩的,而且每次找出的串是在表中最长的 串,然后对其进行编码,因此,如果我们设法 增加表中长串的数量,则压缩比也就越高,即 串越长,输出越少。
②串表中的每一个串均具有前缀特性,即: 如果Kx(K为一个串,x为一个字符)在串表中, 则字的前缀K一定在串表中(称之为前缀条件)。
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
4
a
b
aa
ab
0H
0H
a
b
aa<4H>
ab<5H>
LZW编码步骤
(6)读下一个字符b赋给S2。S1+S2=”bb”不在字符串表中, 输出S1=“b”在字串表中的索引1H,并在字符串表末尾为 S1+S2=“bb”添加索引6H,且S1= S2=“b” 。
NULL
a a b
NULL
a aa ab
2H
0H 0H
NULL
a a b aa<4H> ab<5H>
5
6 7
b
b a
bb
bb bba
1H
6H 4H 6H 3H
b
bb a
bb<6H>
bba<7H> Aab<8H>
8
9 10 11 12
a
b b
aa
aab bb
aa
b bb
解码步骤
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
字符串 索引
a b
c d LZW_CLEAR LZW_EOI
0H 1H
2H 3H 4H 5H
输入数据S2 NULL
S1+S2 NULL
a a aS1为NULL,故 aa 输出结果为空 b ab aa不存在,故输出 c bc S1=“a”的索引 ab 不存在,故输出 0H a ca S1=“a”的索引 0H b ab b 结果已存 abb S1+S2 在,b 故输出结果 bb 为空 bb b d 此时已无 输入 bbd
序号 输入数据S2 S1+S2 1 2 3 4 NULL a a b NULL a aa ab 0H 0H 输出结果 2H S1 NULL a a b aa<4H> ab<5H> 生成新字符及索引
5
6 7
b
b a
bb
bb bba
1H
6H
b
bห้องสมุดไป่ตู้ a
bb<6H>
bba<7H>
LZW编码步骤
(9)读字符a赋给S2。S1+S2=”aa”在字符串表中,则 S1= S1+S2=“aa”
输出结果 S1 生成的新字符串及索引 4H NULL S1+S2在字符表 中 ,S1=S1+S2 a S1+S2 不在字符 a 表中,S1=S2=“a” aa <6H> 0H S1+S2 不在字符 表中,S1=S2=“b” 0H b ab <7H>
1H 2H 7H 1H
BH
c a
ab b
bc <8H> ca <9H> S1+S2 在字符表
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
4 5
a
b b
aa
ab bb
0H
0H 1H
a
b b
aa<4H>
ab<5H> Bb<6H>
LZW编码步骤
(7)读字符b赋给S2。S1+S2=”bb”在字符串表中,则 S1= S1+S2=“bb” 。
LZW编码
和用较短的符号标记替代冗余字符的概念,简称LZ压缩 技术。 1985年,美国人Welch将LZ压缩技术从概念发展到实用 阶段,简称LZW压缩技术。广泛用于图象压缩领域。 LZW(Lempel-Ziv & Welch)编码又称字串表编码, 属于一种无损编码,LZW编码与行程编码类似,也是对字 符串进行编码从而实现压缩,但它在编码的同时还生成 了特定字符串以及与之对应的索引字符串表。
3
4 5
a
b b
aa
ab bb
0H
0H 1H 6H 4H
a
b b
aa<4H>
ab<5H> bb<6H> bba<7H> Aab<8H>
6
7 8 9
b
a a b
bb
bba aa aab
bb
a aa b
LZW编码步骤 (11)读字符b赋给S2。S1+S2=”bb”,在字符串表中, 则 S1= S1+S2=“b”
算 术 编 码
是一种从整个符号序列出发,采用递推形式连续编码的
方法,与建立在符号和码字对应基础上的块码不同,在算术
编码中,源符号和码字间的一一对应关系并不存在。1 个算 术码字要赋给整个信源符号码字,而每个码字本身确定了 0
和1之间的1个实数区间。
算 术 编 码
算术编码具体方法是将被编码的信源消息 表示成实数轴0-1之间的一个间隔,消息越 长,编码表示的间隔就越小,即这一间隔所 需的二进制位数就越多。 采用算术编码每个符号的平均编码长度 可以为小数。
字符串 a b LZW_CLEAR 索引 0H 1H 2H
LZW_EOI
3H
LZW编码步骤
(2)输出LZW_CLEAR在字串表中的索引2H
序号 输入数据S2 S1+S2 1 NULL NULL 输出结果 2H S1 NULL 生成新字符及索引
LZW编码步骤
(3)从图像数据流中第一个字符开始,读取一个字符a, 将其赋给字符串变量S2。判断S1+S2=”a”在字符串表中, 则S1=S1+S2=“a”
LZW编码
行程编码适合于对二值图像的编码,如果 图像是由很多块颜色或灰度相同的大面积区域 组成的,采用行程编码可以达到很大的压缩比。
通常,为了达到比较好的压缩效果,一般 不单独使用行程编码,而是和其他编码方法结合 使用。如:在JPEG中,就综合使用了行程编码以 及哈夫曼编码。
1977年,以色列人Lempel和Ziv共同提出了查找冗余字符
序号 输入数据S2 S1+S2 1 2 3 4 5 NULL a a b b NULL a aa ab bb 0H 0H 1H 6H 4H 输出结果 2H S1 NULL a a b b aa<4H> ab<5H> bb<6H> bba<7H> Aab<8H> 生成新字符及索引
6
7 8 9 10
b
a a b b
步骤3:判断P+C是否在词典中 (1)如果“是”,则用C扩展P,即让P:=P+C (2)如果“否”,则 输出与当前前缀P相对应的码字; 将P+C添加到词典中; 令P:=C,现在的P仅包含一个字符C
步骤4:判断码字流中是否还有码字要译 (1)如果“是”,就返回到步骤2;
(2)如果“否” 把代表当前前缀P的码字输出到码字流; 结束。
序号 输入数据S2 S1+S2 1 2 3 4 NULL a a b NULL a aa ab 0H 0H 输出结果 2H S1 NULL a a b aa<4H> ab<5H> 生成新字符及索引
5
6 7
b
b a
bb
bb bba
1H
6H
b
bb a
bb<6H>
bba<7H>
8
a
aa
aa
LZW编码步骤
LZW编码举例
输入数据流: 位置 1
字符 A 2 B 3 B 4 A 5 B 词典 A B C AB BB 1 2 6 A 7 B 8 A 9 C
编码过程:
步骤 位置 码字 1 2 3 1 2 1 2 4 5 输出
3
4 5 6
3
4 6
6
7 8
BA
ABA ABAC
2
4 7 3
LZW编码实例
aabcabbbbd 初始化字符串表
bb
bba aa aab bb
bb
a aa b bb
LZW编码步骤
(12)输出S1中的字符串”b”在字串表中的索引1H
序号 输入数据S2 S1+S2 输出结果 S1 生成新字符及索引
1
2 3 4 5 6 7
NULL
a a b b b a
NULL
a aa ab bb bb bba
2H
0H 0H 1H 6H 4H
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
序号 输入数据S2 S1+S2 1 2 NULL a NULL a 输出结果 2H S1 NULL a 生成新字符及索引
3
a
aa
0H
a
aa<4H>
LZW编码步骤
(5)读下一个字符b赋给S2。判断S1+S2=”ab”不在字符串 表中,输出S1=“a”在字串表中的索引0H,并在字符串表末 尾为S1+S2=“ab”添加索引5H,且S1= S2=“b”
中,S1=S1+S2
abb <AH> bb <BH>
b bb
3H 5H
d S1的索 bbd <CH> 输出 引3H
输出LZW_EOI 标志的索引
LZW编码步骤
设来源于二色系统的图像数据源 :aabbbaabb (1)根据图像中使用的颜色数初始化一个字符串表, 字符串表中的每个颜色对应一个索引。 在初始字符串表的LZW_CLEAR和LZW_EOI分别为字符表 初始化标志和编码结束标志。
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 8)读入code=3H,解码完毕。
待编码的数据序列为“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 ]
LZW压缩使用字典库查找方案。它读入待
压缩的数据并与一个字典库(库开始是空的) 中 的字符串对比,如有匹配的字符串,则输出该
字符串数据在字典库中的位置索引,否则将该 字符串插入字典中。
LZW编码算法
步骤1:将词典初始化为包含所有可能的单字 字符,当前前缀P初始化为空。 步骤2:当前字符C:=字符流中的下一个字符。
NULL
a a b b bb a bba<7H> Aab<8H> aa<4H> ab<5H> bb<6H>
8
9 10
a
b b
aa
aab bb
aa
b bb
11
6H
LZW编码步骤 (13)输出结束标志LZW_EOI的索引3H,编码完毕
序号 输入数据S2 S1+S2 输出结果 S1 生成新字符及索引
1
2 3 4