LZW编码算法详解
LZW编码
•张益君 •郑 红
LZW编码介绍
LZW编码算法背景 LZW编码算法基本概念 LZW编码算法基本原理 LZW压缩算法 LZW解压算法 LZW压缩的特点
LZW编码算法背景 • LZW(Lempel-Ziv & Welch)编码又称字串表编码,是 Welch将Lemple和Ziv所提出来的无损压缩技术改进 后的压缩方法。GIF图像文件采用的是一种改良的 LZW压缩算法,通常称为GIF-LZW压缩算法
• 这种算法的设计着重在实现的速度,它并没有对数 据做任何分析
LZW编码算法基本概念 • LZW压缩有三个重要的对象:数据流 (CharStream)、编码流(CodeStream)和编译表 (String Table)。在编码时,数据流是输入对象 (文本文件的据序列),编码流就是输出对象(经 过压缩运算的编码数据);在解码时,编码流则是 输入对象,数据流是输出对象;而编译表是在编码 和解码时都须要用借助的对象。字符(Character): 最基础的数据元素,在文本文件中就是一个字节, 在光栅数据中就是一个像素的颜色在指定的颜色列 表中的索引值;字符串(String):由几个连续的字 符组成;
LZW压缩算法
LZW算法流程: 步骤1: 开始时的词典包含所有可能的根(Root), 而当前前缀P是空的; 步骤2: 当前字符(C) :=字符流中的下一个字符; 步骤3: 判断缀-符串P+C是否在词典中 (1) 如果“是”:P := P+C // (用C扩展P) ; (2) 如果“否” ① 把代表当前前缀P的码字输出到码字ห้องสมุดไป่ตู้; ② 把缀-符串P+C添加到词典; ③ 令P := C //(现在的P仅包含一个字符C); 步骤4: 判断码字流中是否还有码字要译 (1) 如果“是”,就返回到步骤2; (2) 如果“否” ① 把代表当前前缀P的码字输出到码字流; ② 结束。
LZW编码算法详解
LZW编码算法详解
LZW(Lempel-Ziv & Welch)编码又称字串表编码,是Welch将Lemple和Ziv所提出来的无损压缩技术改进后的压缩方法。GIF图像文件采用的是一种改良的LZW 压缩算法,通常称为GIF-LZW压缩算法。下面简要介绍GIF-LZW的编码与解码方程
解:例现有来源于二色系统的图像数据源(假设数据以字符串表示):aabbbaabb,试对其进行LZW编码及解码。
1)根据图像中使用的颜色数初始化一个字串表(如表1),字串表中的每个颜色对应一个索引。在初始字串表的LZW_CLEAR和LZW_EOI分别为字串表初始化标志和编码结束标志。设置字符串变量S1、S2并初始化为空。
2)输出LZW_CLEAR在字串表中的索引3H(见表2第一行)。
3)从图像数据流中第一个字符开始,读取一个字符a,将其赋给字符串变量S2。判断S1+S2=“a”在字符表中,则S1=S1+S2=“a”(见表2第二行)。
4)读取图像数据流中下一个字符a,将其赋给字符串变量S2。判断S1+S2=“aa”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字串表末尾为
S1+S2="aa"添加索引4H,且S1=S2=“a”(见表2第三行)。
5)读下一个字符b赋给S2。判断S1+S2=“ab”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字串表末尾为S1+S2=“ab”添加索引5H,且
S1=S2=“b”(见表2第四行)。
6)读下一个字符b赋给S2。S1+S2=“bb”不在字串表中,输出S1=“b”在字串表中的索引1H,并在字串表末尾为S1+S2=“bb”添加索引6H,且
无损压缩算法的比较和分析
无损压缩算法的比较和分析
无损压缩算法是一种将文件或数据压缩成较小体积,而又能保持原始数据完整性的技术。在实际应用中,有多种无损压缩算法可供选择,每种算法都有其独特的优点和适用场景。以下是对三种常见的无损压缩算法,LZ77、LZ78和LZW算法,的比较和分析。
1.LZ77算法
LZ77算法是一种基于滑动窗口的算法,通过将数据中的重复片段替换为指向该片段的指针,来实现数据压缩。该算法具有简单高效的特点,适用于具有较多重复片段的数据。LZ77算法在处理图片、视频等文件时表现出色,能够对重复的像素块进行有效压缩,但对于无重复的文件压缩效果较差。
2.LZ78算法
LZ78算法是一种基于前缀编码的算法,通过构建一个字典来记录文件中的重复字串,并用索引指向字典中的相应位置,从而实现数据压缩。与LZ77算法相比,LZ78算法在处理无重复文件时表现更好,由于引入了字典的概念,能够较好地处理无重复字串的情况。然而,LZ78算法的压缩率相对较低,在对具有大量重复片段的文件进行压缩时,效果不如
LZ77算法。
3.LZW算法
LZW算法是一种基于字典的算法,与LZ78算法类似,通过构建字典来实现数据压缩。LZW算法利用一个初始字典来存储单个字符,并逐渐增加字典的大小,以适应不同长度的字串。该算法具有较好的压缩率和广泛
的应用领域,可适用于文本、图像、音频等各类型文件的压缩。然而,LZW算法的缺点是需要事先构建和传递字典,增加了存储和传输的复杂性。
综上所述,无损压缩算法的选择应考虑文件的特点和需求。对于具有
大量重复片段的文件,LZ77算法能够实现较好的压缩效果;对于无重复
LZW编码详解
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
S1+S2=“bba”添加索引7H,且S1= S2=“a”
序号 输入数据S2 S1+S2 输出结果
S1
生成新字符及索引
1 NULL 2a 3a 4b 5b 6b 7a
NULL 2H
a
aa
0H
ab
0H
bb
1H
bb
bba
6H
NULL a a b b bb a
aa<4H> ab<5H> bb<6H>
bba<7H>
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)
中文文本压缩的lzw算法
中文文本压缩的lzw算法
LZW(Lempel-Ziv-Welch)算法是一种无损数据压缩算法,常用于压
缩文本数据。该算法由Abraham Lempel、Jacob Ziv和Terry Welch在1977年提出。
LZW算法的基本思想是建立一个字典,将输入的文本数据分成一个个
的短语,并将每个短语编码成固定长度的码字。最初的字典中包含所有的
单个字符。然后,从输入数据中读取字符,如果已经存在于字典中,则将
当前字符串与下一个字符拼接形成更长的短语,直到找到一个不在字典中
的短语。将这个短语编码为一个码字,并将该短语添加到字典中。重复以
上步骤,直到遍历完整个输入数据。
LZW算法的核心是字典的管理和更新,其中字典可以使用哈希表或者
前缀树等数据结构来实现。在编码过程中,算法会不断将新的短语添加到
字典中,因此字典会随着输入数据的处理而逐渐增大。为了避免字典过大,可以设置一个上限值,并在达到上限时清空字典或采用其他策略。
在解码过程中,需要建立与编码过程相同的字典,并使用编码得到的
码字来还原原始的短语。解码过程从第一个码字开始,将其对应的短语输出,然后将该短语加入字典,并继续解码下一个码字,直到解码完所有的
码字。
LZW算法的优点是能够通过动态生成的字典来提高压缩效率,对于重
复出现较多的短语可以得到较少的码字,从而实现有效的压缩。而且,LZW算法是无损压缩算法,解压缩后的数据与原始数据完全一致。
然而,LZW算法也存在一些限制和问题。首先,虽然LZW算法可以在
一些情况下获得较高的压缩比,但对于一些类型的数据,如随机数据或已
LZW编码(基于MATLAB)
%读取编码文件和输出文件
fid_input = fopen('C:\Users\Administrator\Desktop\matlab\ssby.txt');%打开要编码的数据所在文件
fid_output = fopen('C:\Users\Administrator\Desktop\matlab\shuchu.txt','w');%打开压缩后的数据所在文件
D = fscanf(fid_input,'%c'); %读取数据
D_Length = size(D,2); %获取数据长度
zidian = ''; %字典
changdu = 1; %字典长度
zhizhen = 1; %字典位置指针
mabiao = 256;%字典码表
X1 = '';%要查找的新字符
X = '';%当前字符
weizifu = '';%尾字符
duqu = D(1);%读入一个新字符
weizifu = duqu;
X = weizifu;
for i = 2:D_Length
duqu = D(i);%读入一个新字符
weizifu = duqu;
X1=[X,weizifu];
if i > 2
for i1 = 1:changdu
if strcmp(zidian(i1),X1) == 1%字典中已有W1
Find_W1 = 1;%字典中找到W1
break;%弹出
end
Find_W1 = 0;
end
if Find_W1 == 1 || size(X1,2) == 1 %字典中找到W1,做一下W和W1的变换则返回
X = X1;
常见数据压缩算法
常见数据压缩算法
数据压缩是一种将数据表示为较短表示形式的技术,以便在存储或传输数据时减少所需的空间或带宽。数据压缩算法是实现数据压缩的关键。在本文中,我们将介绍一些常见的数据压缩算法,包括哈夫曼编码、Lempel-Ziv-Welch (LZW) 编码和算术编码。
1. 哈夫曼编码
哈夫曼编码是一种基于字符频率的前缀编码。它通过构建一棵哈夫曼树来实现压缩。在哈夫曼树中,出现频率较高的字符被赋予较短的编码,而出现频率较低的字符被赋予较长的编码。通过这种方式,我们可以将数据中出现频率较高的字符用较短的编码表示,从而实现压缩效果。
2. Lempel-Ziv-Welch (LZW) 编码
LZW 编码是一种无损压缩算法,常用于无损图像压缩和文本压缩。它利用字典来表示数据中的重复模式,并将其替换为较短的编码。在LZW编码中,初始字典由所有可能的输入符号组成,然后在编码过程中动态地更新字典。通过识别和替换重复的模式,LZW编码可以显著减少数据的大小。
3. 算术编码
算术编码是一种无损压缩算法,它将数据表示为一个介于0和1之间的实数。在算术编码中,每个输入符号都被赋予一个区间,该区
间对应于该符号在数据中出现的概率。通过不断缩小区间的范围,最终得到一个介于0和1之间的实数,该实数表示原始数据。与其他压缩算法不同,算术编码可以实现非常高的压缩比,因为它可以精确地表示输入符号的概率。
哈夫曼编码、LZW编码和算术编码是常见的数据压缩算法。它们都能有效地减少数据的大小,从而节省存储空间和传输带宽。在实际应用中,我们可以根据不同的需求选择适当的算法来进行数据压缩。通过合理地使用这些算法,我们可以在存储和传输数据时提高效率并减少成本。
LZW压缩算法介绍
LZW压缩算法介绍
LZW (Lempel-Ziv-Welch) 压缩算法是一种基于字典的无损压缩算法。它由Abraham Lempel、Jacob Ziv和Terry Welch于1977年共同开发,
被广泛应用于无损图像压缩、文本压缩等领域。
在编码阶段中,首先通过初始化一个字典,其中包含了所有可能的输
入符号,并将其索引与其对应编码值相对应。算法从输入数据的第一个符
号开始,将其添加到当前待编码的字符串中。然后,它迭代地检查是否存
在一个包含当前字符串和下一个符号的条目在字典中。如果存在,则将当
前字符串扩展为当前字符串加上下一个符号,并继续检查。如果不存在,
则将当前字符串的编码输出,并将当前字符串加上下一个符号添加到字典中。此过程将重复,直到输入数据中的所有符号都编码为字典中的条目。
在解码阶段中,解码器初始化一个与编码过程使用相同的字典。它从
压缩数据流中读取编码值,并将其对应的字符串输出。解码器在字典中根
据编码值查找对应的字符串,然后将它添加到输出流中。然后,解码器通
过查找输出流尾部的条目,将一个新的编码加上条目的第一个符号创建一
个新的条目,并将该新的条目添加到字典中。这个过程将重复,直到所有
编码值都被解码为对应的字符串。
LZW压缩算法的优点是它能够达到很高的压缩比。由于它利用了字典
中的重复条目,它可以将输入数据中的相同模式编码为较短的编码值。此外,它还具有较快的压缩和解压缩速度,因为它只需要查找字典而不需要
进行复杂的算术操作。
然而,LZW算法也有一些限制。首先,它要求压缩器和解压器具有相
lzw压缩方法
lzw压缩方法
LZW压缩算法又叫“串表压缩算法”,通过建立一个将字符串和其对应的记号构成的表(把已经出现过的字符串映射到记号上),用较短的代码来表示较长的字符串来实现压缩。LZW算法的具体步骤如下:
1. 初始化字典:初始时,字典包含所有可能的单个字符作为键,并将其映射到对应的编码值。例如,对于8位ASCII字符,字典将包含256个键值对。
2. 读取输入数据并构建字符串:从输入数据中读取第一个字符,并将其添加到当前字符串中。
3. 查找字符串在字典中的编码:检查当前字符串是否存在于字典中。如果是,将当前字符串扩展一个字符,并继续查找新的扩展字符串。重复此过程,直到找不到匹配的字符串。
4. 输出编码值:找到最长的匹配字符串后,输出该字符串在字典中的编码值。
5. 更新字典:将当前字符串的扩展添加到字典中,分配一个新的编码值。
6. 重置字符串:将当前字符串重置为最后一个字符,以便继续下一个循环。
7. 重复步骤2-6直到输入数据处理完毕。
c语言lzw编码解码
LZW(Lempel-Ziv-Welch)是一种无损数据压缩算法。以下是一个简单的C语言实现的LZW编码和解码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CODE_SIZE 128
typedef struct {
int code;
char ch;
} Code;
void init_codes(Code codes[]) {
for (int i = 0; i < MAX_CODE_SIZE; i++) {
codes[i].code = i;
codes[i].ch = i;
}
}
int next_code(Code codes[], char ch) {
for (int i = 0; i < MAX_CODE_SIZE; i++) {
if (codes[i].ch == ch) {
return codes[i].code;
}
}
return -1;
}
void compress(char *input, char *output) {
Code codes[MAX_CODE_SIZE];
init_codes(codes);
int input_len = strlen(input);
int output_index = 0;
int current_code = 256;
int current_len = 1;
int max_len = 1;
int next_index = 0;
lzrw实现原理
lzrw实现原理
LZRW算法实现原理
简介
LZRW是一种常用的无损压缩算法,可以在文件传输和存储中起到
很好的节省空间的作用。本文将从浅入深解释LZRW算法的实现原理。LZRW算法的基本思想
1.Lempel-Ziv算法:LZRW算法是在LZ77算法的基础上
进行改进的。Lempel-Ziv算法通过建立一个字典,将重复出现的
字符串替换为索引值,从而实现对数据的压缩。但是LZ77算法
存在一些问题,如字典的存储开销过大和效率较低等。因此,
LZRW算法在LZ77算法的基础上进行了一些优化和改进。
2.LZRW算法流程:LZRW算法的基本流程如下:
–初始化:建立一个空白字典。
–读取输入数据:将输入数据按照预定的窗口大小进行分割。
–查找字典:在字典中查找与当前窗口内容匹配的最长字符串。
–替换字符串:将匹配的字符串替换为对应的索引值。
–更新字典:将当前窗口内容加入字典中。
–输出结果:输出压缩后的数据。
LZRW算法核心原理
1.字典的建立:LZRW算法通过使用前缀树(Trie)来
实现字典的建立和查找。前缀树是一种以字符串为边的有向无环图,每个节点代表一个字符串的前缀。节点之间的边表示字符关系。通过遍历前缀树,就可以确定最长匹配字符串,并将其替换为对应的索引。
2.最长匹配字符串的查找:从当前窗口的起始位置开始
向后遍历,逐个比较字符,直到遇到一个不匹配的字符。查找过程可以通过快速查找算法(如KMP算法)来优化。
3.字符串的替换和索引的编码:被匹配到的字符串会被
替换为字典中对应字符串的索引值,以便产生更好的压缩效果。
LZW算法
压缩前的大 压缩后的大 小(字节) 小(字节)
114
83
114
137
压缩比
72.8% 120%
LZW算法对包含较多重复字符串的文件压 缩效果更好。
用12位、16位码长分别压缩较大文件:
项目
码长 12位 16位
压缩前的大 压缩后的大 小(字节) 小(字节)
89460 89460
81303 55226
从结果可见压缩原理:原始数据中一般单字符 用8位二进制数表示,若代码长度取9位二进制 数(即字典可包含约29个词条),则占用48位 的字符串“sirsir”可以用共45位长的5个代码表 示,可以看到实现了压缩。
3.LZW解码
解码原理:解码器输入的是代码流,输出的是 字符串。解码器首先初始化串表,然后读取输 入代码流,根据输入代码查找自己的串表后输 出字符串,同时采用和编码器相应的方式扩展 自己的串表。
文本2.txt内容为: “mansopdhifjklasmdfawsdhinsjakdlhiofjpklhuijvklhvij kawsdfhijklmxnoxpaysdfhzijkafmnopuvswuvwmdnop uyzmnolpxykzmjniohp”。
取12位代码长度压缩结果
项目
文件 1.txt 2.txt
压缩比
90.9% 61.7%
16位长代码压缩效果更好。
JPEG压缩原理LZW算法
JPEG压缩原理LZW算法
JPEG(Joint Photographic Experts Group)是一种常用的图像压缩格式,常用于对数字图像的有损压缩。JPEG压缩算法的原理主要包括色彩空间转换、离散余弦变换、量化和熵编码等步骤。本文将重点介绍JPEG压缩中的熵编码步骤,即LZW(Lempel-Ziv-Welch)算法。
LZW算法是一种无损压缩算法,由Abraham Lempel、Jacob Ziv和Terry Welch于1977年提出。它通过利用数据中重复出现的模式来压缩数据,将重复的模式用较短的编码表示,从而减小数据的存储空间。
LZW算法的基本思想是建立一个编码字典,将数据中的模式映射到特定的编码。算法逐个读取输入的数据字符,将字符与之前已经出现的模式进行匹配。如果匹配成功,则继续读取下一个字符,与之前的模式再进行匹配。如果匹配失败,则将之前匹配成功的模式的编码输出,并将当前字符及其前缀添加到字典中作为新的模式。这样,压缩数据中的重复模式就可以用更短的编码表示,实现数据的压缩。
在JPEG压缩中,LZW算法主要应用于熵编码步骤,用于对离散余弦变换后的图像的系数进行压缩。具体步骤如下:
1.构建初始的编码字典,包含0到255的所有灰度级作为初始编码。
2.遍历离散余弦变换后的图像系数,将系数分组为一个个的模式。每个模式可以是一系列连续的系数,可以是独立的一个系数。
3.逐个读取模式,检查字典中是否存在该模式。
-如果存在,继续读取下一个系数,并将当前模式与读取的系数连接形成新的模式。
lzw编码原理
lzw编码原理
LZW(Lempel-Ziv-Welch)编码是一种无损压缩算法,基于字典的压缩算法。它的原理如下:
1. 初始化字典:创建一个初始字典,其中包含所有单个输入符号(字符)作为键,对应的编码为它们的ASCII码值。
2. 分割输入:将输入字符串分割为一个个输入符号的序列。
3. 初始化缓冲区:将第一个输入符号加入到缓冲区中。
4. 处理输入序列:从第二个输入符号开始,重复以下步骤直到处理完所有输入符号:
- 将当前输入符号与缓冲区中的符号连接,得到一个新的符号。
- 如果新的符号在字典中存在,则将其加入到缓冲区中,继续处理下一个输入符号。
- 如果新的符号不在字典中,则将缓冲区中的符号编码输出,将新的符号添加到字典中,并将新的符号作为下一个缓冲区。
5. 输出编码:当所有输入符号处理完后,将缓冲区中的符号(不包括最后一个输入符号)编码输出。
LZW编码的核心思想是使用字典记录出现过的符号及其编码,以减少编码的长度。在处理输入序列时,如果新的符号在字典中存在,则将其添加到缓冲区,并继续处理下一个输入符号;如果新的符号不在字典中,则将缓冲区中的符号编码输出,并将新的符号添加到字典中。
由于LZW编码使用了字典记录已编码的符号,因此在解码时只需根据字典中的编码逆向查找对应的符号即可恢复原始输入序列。
实用的无失真信源编码之LZW压缩编码讲述
Page
7
1977 年,以色列人Ziv 和 Lempel提出了 全新的一个压缩技术被称为 LZ77 算法。 1985年由美国人Welch在LZ77算法基础上提 出LZW编码算法并进入实用阶段。 它们的思路和字典颇为相似,因此,人 们将基于这一思路的编码方法称作字典式 编码。其在压缩效果上大大超过了霍夫曼 编码,其压缩和解压缩的速度也异常惊人 ,打破了霍夫曼编码一统天下的局面。
(271,13)(213,8)
牛津词典共1354页,每页不超过64字,页 码用11位二进制数表示,每页第几个用6位二 进制数表示,则2个单词用34位数据表示。而 原始数据若用8位ASCII码表示,数据为 16*8=128位。压缩比为128/34=3.8倍。
Page
12
2、LZW编码方法
LZW压缩有三个重要的对象:数据流、 编码流和字典(编译表)。
Page
5
常见的无失真信源编码方法
“游程编码”、“霍夫曼编码”、 “算术编 码”、“LZW编码” 概率匹配压缩原理
根据信源的统计特性,用短码来代替频 繁出现的原始数据,从而达到压缩的目的。
Page
6
二、LZW编码
在70年代末以前,以霍夫曼编码为 代表的概率匹配压缩模型在数据压缩领 域一直占据着统治地位。 这类编码属于静态概率编码,需要预 知原始消息的概率分布。但大多数信源 的概率是很难预知,甚至概率分布是变 动的。
lzw编码原理
lzw编码原理
LZW(Lempel-Ziv-Welch)编码是一种无损数据压缩算法,它基于字典的概念来实现压缩。LZW编码算法的原理如下:
1. 初始化字典:首先,创建一个初始字典,其中包含所有可能的单个输入符号(例如,字母、数字和符号)。
2. 获取输入符号:从输入数据中读取第一个输入符号作为当前字串。
3. 处理输入符号:检查当前字串是否存在于字典中:
- 如果存在,将下一个输入符号添加到当前字串末尾,以获得一个更长的字串。然后返回到第3步,继续处理新的当前字串。
- 如果不存在,将当前字串的编码(即其在字典中的索引)输出,并将当前字串及其下一个输入符号添加到字典中。然后返回到第2步,从下一个输入符号开始处理。
4. 重复步骤2和3,直到所有输入符号都被处理完。
5. 输出编码:输出所有处理过的编码,即压缩后的数据。
LZW编码算法的关键是利用字典来存储已经出现过的字串及其对应的编码。通过在压缩过程中动态更新字典,LZW可以利用重复出现的字串来节约存储空间。解压缩过程与压缩过程相反,通过对压缩后的编码逐个解码,然后动态构建字典来重构原始数据。
LZW编码的优势在于对于包含重复出现的字串的数据可以实现较高的压缩比率。然而,它也可能由于字典的不断增长导致压缩后的数据比原始数据更大。因此,在实际应用中,LZW
编码通常与其他压缩算法结合使用,例如在GIF图像压缩中的应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LZW编码算法详解
LZW(Lempel-Ziv & Welch)编码又称字串表编码,是Welch将Lemple和Ziv所提出来的无损压缩技术改进后的压缩方法。GIF图像文件采用的是一种改良的LZW 压缩算法,通常称为GIF-LZW压缩算法。下面简要介绍GIF-LZW的编码与解码方程
解:例现有来源于二色系统的图像数据源(假设数据以字符串表示):aabbbaabb,试对其进行LZW编码及解码。
1)根据图像中使用的颜色数初始化一个字串表(如表1),字串表中的每个颜色对应一个索引。在初始字串表的LZW_CLEAR和LZW_EOI分别为字串表初始化标志和编码结束标志。设置字符串变量S1、S2并初始化为空。
2)输出LZW_CLEAR在字串表中的索引3H(见表2第一行)。
3)从图像数据流中第一个字符开始,读取一个字符a,将其赋给字符串变量S2。判断S1+S2=“a”在字符表中,则S1=S1+S2=“a”(见表2第二行)。
4)读取图像数据流中下一个字符a,将其赋给字符串变量S2。判断S1+S2=“aa”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字串表末尾为
S1+S2="aa"添加索引4H,且S1=S2=“a”(见表2第三行)。
5)读下一个字符b赋给S2。判断S1+S2=“ab”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字串表末尾为S1+S2=“ab”添加索引5H,且
S1=S2=“b”(见表2第四行)。
6)读下一个字符b赋给S2。S1+S2=“bb”不在字串表中,输出S1=“b”在字串表中的索引1H,并在字串表末尾为S1+S2=“bb”添加索引6H,且S1=S2=“b”(见表2第五行)。
7)读字符b赋给S2。S1+S2=“bb”在字串表中,则S1=S1+S2=“bb”(见表2第六行)。
8)读字符a赋给S2。S1+S2=“bba”不在字串表中,输出S1=“bb”在字串表中的索引6H,并在字串表末尾为S1+S2=“bba”添加索引7H,且S1=S2=“a”(见表2第七行)。
9)读字符a赋给S2。S1+S2=“aa”在字串表中,则S1=S1+S2=“aa”(见表2第八行)。
10)读字符b赋给S2。S1+S2=“aab”不在字串表中,输出S1=“aa”在字串表中的索引4H,并在字串表末尾为S1+S2=“aab”添加索引8H,且S1=S2=“b”(见表2第九行)。
11)读字符b赋给S2。S1+S2=“bb”,在字串表中,则S1=S1+S2=“b”(见表2第十行)。
12)输出S1中的字符串"b"在字串表中的索引1H(见表2第十一行)。
13)输出结束标志LZW_EOI的索引3H,编码完毕。
最后的编码结果为"30016463“。
下面对上述编码结果"30016463"进行解码。同样先初始化字符串表,结果如表1所示。
1)首先读取第一个编码Code=3H,由于它为LZW_CLEAR,无输出(见表3第一行)。
2)读入下一个编码Code=0H,由于字符串表中存在该索引,因此输出字符串表中0H对应的字符串"a",同时使OldCode=Code=0H(见表3第二行)。
3)读下一个编码Code=0H,字符串表中存在该索引,输出0H所对应的字符串"a",然后将OldCode=0H所对应的字符串"a"加上Code=0H所对应的字符串的第一个字符"a",即"aa"添加到字串表中,其索引为4H,同时使OldCode=Code=0H (见表3第三行)。
4)读下一个编码Code=1H,字串表中存在该索引,输出1H所对应的字符串"b",然后将OldCode=0H所对应的字符串"a"加上Code=1H所对应的字符串的第一个字符"b",即"ab"添加到字串表中,其索引为5H,同时使OldCode=Code=1H (见表3第四行)。
5)读入下一个编码Code=6H,由于字串表中不存在该索引,因此输出OldCode=1H所对应的字符串"b"加上OldCode的第一个字符"b“,即"bb",同时将"bb"添加到字符串表中,其索引为6H,同时使OldCode=Code=6H(见表3第五行)。
6)读下一个编码Code=4H,字串表中存在该索引,输出4H所对应的字符串"aa",然后将OldCode=6H所对应的字符串"bb"加上Code=4H所对应的字符串的第一个字符"a",即"bba"添加到字串表中,其索引为7H,同时使OldCode=Code=4H (见表3第六行)。
7)读下一个编码Code=6H,字串表中存在该索引,输出6H所对应的字符串"bb",然后将OldCode=4H所对应的字符串"aa"加上Code=6H所对应的字符串的第一个字符"b",即"aab"添加到字串表中,其索引为8H,同时使OldCode=Code=6H (见表3第七行)。
8)读下一个编码Code=3H,它等于LZW_EOI,数据解码完毕(见表3第八行)。
最后的解码结果为aabbbaabb。
由此可见,LZW编码算法在编码与解码过程中所建立的字符串表是一样的,都是动态生成的,因此在压缩文件中不必保存字符串表。
1.LZW的全称是什么?
Lempel-Ziv-Welch (LZW).
2. LZW的简介和压缩原理是什么?
LZW压缩算法是一种新颖的压缩方法,由Lemple-Ziv-Welch 三人共同创造,用他们的名字命名。它采用了一种先进的串表压缩,将每个第一次出现的串放在一个串表中,用一个数字来表示串,压缩文件只存贮数字,则不存贮串,从而使图象文件的压缩效率得到较大的提高。奇妙的是,不管是在压缩还是在解压缩的过程中都能正确的建立这个串表,压缩或解压缩完成后,这个串表又被丢弃。
LZW算法中,首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数字来表示,这个数字与此字符串在串表中的位置有关,并将这个数字存入压缩文件中,如果这个字符串再次出现时,即可用表示它的数字来代替,并将这个数字存入文件中。压缩完成后将串表丢弃。如"print" 字符串,如果在压缩时用266表示,只要再次出现,均用266表示,并将"print"字符串存入串表中,在图象解码时遇到数字266,即可从串表中查出266所代表的字符串"print",在解压缩时,串表可以根据压缩数据重新生成。
3.在详细介绍算法之前,先列出一些与该算法相关的概念和词汇
1)'Character':字符,一种基础数据元素,在普通文本文件中,它占用1个单独的byte,而在图像中,它却是一种代表给定像素颜色的索引值。
2)'CharStream':数据文件中的字符流。
3)'Prefix':前缀。如这个单词的含义一样,代表着在一个字符最直接的前一个字符。一个前缀字符长度可以为0,一个prefix和一个character可以组成一个字符串(string),