




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二篇 压缩与编码数字信号的压缩与编码是多媒体的核心技术和重要内容。在第3章所讲的,音频信号的自适应编码、差分编码和预测编码等,都是典型的压缩编码。本篇先介绍压缩的基本概念,再讲解可用于静态图像编码的若干常用熵编码压缩算法,然后介绍DCT与JPEG编码、运动图像和伴音的MPEG编码压缩算法、新兴的H.264/AVC视频编码、以及可以用于JPEG 2000和MPEG-4编码的小波变换。本篇分为如下5章:n 第7章 压缩与熵编码n 第8章 DCT与JPEG编码n 第9章 MPEG编码方法n 第10章 n 第11章 小波变换与JPEG 2000编码第7章 压缩与熵编码由于多媒体信号的数据量巨大,为了
2、节省存储空间和传输带宽,需进行压缩编码。多媒体数据的压缩方法,可以分成三大类,其中的熵编码是基础,源编码是重点,而将它们二者相结合的混合编码则是各种编码标准所采用的主要方法。本章先介绍压缩的基本概念,包括:压缩的需要与可能、算法的特点与分类和一般的编码过程。然后,在了解熵定义的基础上,讨论若干常用的熵编码算法,包括:Shannon-Fano编码、Huffman编码、算术编码、RLE和可用于GIF和PNG图像编码LZW算法。7.1 压缩概论数据压缩(data compression) ,在电子与通信领域也常被称为信号编码(signal coding),包括压缩(compress)和还原(deco
3、mpress,解压缩/重构)即编码(encode/code)和解码(decode,译码)两个步骤。与压缩相关的学科有:信息论、数学、信号处理、数据压缩、编码理论和方法。 压缩的需要与可能由于多媒体信号的数据量巨大,所以需要压缩;同时,由于在多媒体数据中,存在着各种冗余,所以可以压缩。l 压缩的需要数据量巨大是多媒体信号的特点,例如:n 一幅1024*1024真彩图:1024行 * 1024列 * 3B彩色 = 3MBn 4分钟的CD音乐:44100样本/秒 * 2B(16b)/样 * 2声道 * 60秒 * 4分钟 = 40.37MBn 90分钟的PAL视频:625行 * 864列 * 3B彩
4、色 * 25帧/秒 * 60秒 * 90分为了节省存储空间和传输带宽、进行实时高质的多媒体通信(如视频/音频点播、网络现场直播、可视电话、视频会议等),必须对多媒体数据进行压缩编码。l 压缩的可能多媒体数据和人类感觉存在着各种冗余:n 空间冗余:图像的相邻像素相关;n 时间冗余:相邻音频样本相关、相邻视频帧相关;n 信道冗余:(环绕)立体声的声道之间相关、立体电影/电视的左右视觉信号之间相关;n 频率冗余:相邻的频谱值相关,人对高频信号不敏感或分辨率低;n 统计冗余:信号中有的字符出现的频率高,可以采用较短的编码;有的有的信号特征有标度不变性或统计自相似性(如纹理和分形等);n 结构冗余:多媒
5、体数据存在分布模式,相近的图区可分类(用于矢量量化方法);n 听觉冗余:人耳的低音听阈高、强纯音的频率屏蔽、相邻声音的时域屏蔽;n 视觉冗余:人眼对亮度变化比对色彩的变化更敏感、对高亮区的量化误差不敏感、视网膜分频道。 压缩算法的特点与分类用于多媒体数据的压缩方法众多,可按主要特点将它们分成不同的类型。l 特点n 无损与有损u 无损压缩:能够无失真地从压缩后的数据重构,准确地还原原始数据。可用于对数据的准确性要求严格的场合,如可执行文件和普通文件的压缩、磁盘的压缩,也可用于多媒体数据的压缩。该方法的压缩比一般较小。如差分编码、RLE、Huffman编码、LZW编码、算术编码等。u 有损压缩:有
6、失真,不能完全准确地恢复原始数据,重构的数据只是原始数据的一个近似。可用于对数据的准确性要求不高的场合,如多媒体数据的压缩。该方法的压缩比一般较大。例如预测编码、音感编码、JPEG、MPEG等。n 对称性若编解码算法的复杂性和所需时间差不多,则为对称的编码方法,多数压缩算法都是对称的。但也有不对称的,一般是编码难而解码容易,如Huffman编码与分形编码。但用于密码学的编码方法则相反,是编码容易,而解码则非常非常难。n 帧间与帧内在视频编码中会同时用到帧内与帧间的编码方法,帧内编码是指在一帧图像内独立完成的编码方法,同静态图像的编码,如JPEG;而帧间编码则需要参照前后帧才能进行编解码,并在编
7、码过程中考虑对帧之间的时间冗余的压缩,如MPEG。n 实时性在有些多媒体的应用场合,需要实时处理或传输数据(如现场的数字录音和录影、播放MP3/RM/VCD/DVD、视频/音频点播、网络现场直播、可视电话、视频会议),编解码一般要求延时50ms。这需要简单/快速/高效的算法和高速/复杂的CPU/DSP芯片。n 分级处理有些压缩算法可以同时处理不同分辨率、不同传输速率、不同质量水平的多媒体数据,如JPEG2000、MPEG-2/4。l 分类1. 熵编码熵编码(entropy encoding)是一类利用数据的统计信息进行压缩的无语义数据流的无损编码。信息熵为信源的平均信息量(不确定性的度量)。常
8、见的熵编码有:行程编码(RLE)、LZW编码、香农编码、哈夫曼编码和算术编码等。2. 信源编码(信)源编码(source coding)是一类利用信号原数据在时间域和频率域中的相关性和冗余进行压缩的用语义常有损的编码。种类繁多,可进一步分为:u 预测编码(predictive coding):利用先前和现在的数据对在时间或空间上相邻的下面或后来的数据进行预测,从而达到压缩的目的。如增量调制(DM)、差分和自适应编码(ADPCM)等;u 变换编码(transformation coding):采用各种数学变换方法,将原时间域或空间域的数据变换到频率域或其他域,利用数据在变换域中的冗余或人类感觉的
9、特征来进行压缩。常见的变换编码有:FFT(快速富立叶变换)、DCT(离散余弦变换)、DWT(离散小波变换)和IFS(迭代函数系统)等;u 分层编码(layered coding):将原数据在时空域或频率域上分成若干子区域,利用人类感觉的特征进行压缩编码,然后再合并。如二值位(bit position)、子采样(subsampling)、子带编码(sub-band coding)等;u 其他编码:包括矢量量化(vector quantization)、运动补偿(motion compensation)、音感编码(perceptual audio coding)等。3. 混合编码混合编码(hybr
10、id coding) = 熵编码 + 源编码。大多数压缩标准都采用混合编码的方法进行数据压缩,一般是先利用信源编码进行有损压缩,再利用熵编码做进一步的无损压缩。如H.263、JPEG、MPEG等。表7-1是常见编码方法的汇总。表7-1 常见编码算法PCM预测变换熵其他图像视频线性PCM非线性A/自适应量化APCM差分DM自适应ADPCMFFTDCTDWTW-HHaarK-LSlantRLELZWShannonFanoHuffman算术矢量量化子带轮廓二值音感对象方块渐显逐层内插比特平面抖动帧内预测帧间编码帧间预测运动估计运动补偿条件补偿内插其中,W-H = Walsh-Hadamard沃尔什-
11、哈达马、K-L = Karhumen-Loeve卡乎门-劳夫。 编码过程编码的主要过程是:压缩存储/传输解压缩,在进行编码之前一般还需要进行若干准备工作。在各种编码的准备工作中,主要是模数转换(A/D)和预处理。n A/D转换(Analog-to-Digital conversion):将在时空和取值上都连续的模拟数据,经过采样(sampling)和量化(quantization)变成离散的数字信号:n 预处理(pretreatment):指对得到的初始数字信号进行必要的处理,包括过滤、去噪、增强、修复等;目的是除去数据中的不必要成分、提高信号的信噪比、修复数据的错误等。多媒体数据编解码的一般
12、过程为:A/D 预处理 压缩 存储多媒体信号 数字信号 处理过的数字信号 压缩数据 (子)采样/量化 过滤/去噪/增强/修复源编码/熵编码 传输存储 解码 D/A 压缩数据 重构的数字信号 显示/播放传输 还原/重构(插值)图7-1 多媒体数据的编解码过程7.2 熵编码熵编码(entropy encoding)是一类利用数据的统计信息进行压缩的无语义数据流之无损编码。本章先介绍熵的基本概念,然后介绍哈夫曼(Huffman)编码、算术编码(arithmetic coding)、行程编码(RLE)和LZW编码等常用的熵编码方法。 熵熵(entropy)本来是热力学中用来度量热力学系统无序性的一种物
13、理量(热力学第二定律:孤立系统内的熵恒增):对可逆过程,(孤立系统)其中,S为熵、Q为热量、T为绝对温度。(信息)熵H的概念则是美国数学家Claude Elwood Shannon(香农/仙农/向农)于1948年在他所创建的信息论中引进的,用来度量信息中所含的信息量:(为自信息量的均值数学期望)其中,H为信息熵(单位为bit),S为信源,pi为符号si在S中出现的概率。例如,一幅用256级灰度表示的图像,若每种灰度的象素点出现概率均为pi=1/256,则即编码每一个象素点都需要8位(I ),平均每一个象素点也需要8位(H)。熵编码(entropy encoding)是一类利用数据的统计信息,对
14、无语义的数据流进行压缩的无损型编码。熵可用来度量数据中所包含的信息量,也可以用于刻画熵编码的下限。7.2.2 Huffman编码David Albert Huffman(哈夫曼/赫夫曼/霍夫曼)在MIT攻读博士学位期间于1952年提出了一种从下到上的编码方法,现在被称为Huffman编码,它是一种统计最优的变码长符号编码,让最频繁出现的符号具有最短的编码。Huffman编码被广泛用于多种压缩算法之中,如JPEG和MPEG等。l 编码过程与步骤Huffman编码的过程 = 自底向顶生成一棵二叉树(H树),树中的叶节点为被编码符号及其概率、中间节点为两个概率最小符号(串)的并所构成的符号串及其概率
15、所组成的父节点、根节点为所有符号之串及其概率1。具体编码步骤为:(1) 将符号按概率从小到大顺序从左至右排列叶节点;(2) 连接两个概率最小的顶层节点来组成一个父节点,并在到左右子节点的两条连线上分别标记0和1;(3) 重复步骤2,直到得到根节点,形成一棵二叉树;(4)从根节点开始到相应于每个符号的叶节点的0/1串,就是该符号的二进制编码。由于符号按概率大小的排列既可以从左至右、又可以从右至左,而且左右分枝哪个标记为0哪个标记为1是无关紧要的,所以最后的编码结果可能不唯一,但这仅仅是分配的代码不同,而代码的平均长度是相同的。表7-2 符号出现的次数l 例子符号ABCDE出现的次数2010515
16、10例如,有一幅40个象素组成的灰度图像,灰度共有5级,分别用符号A、B、C、D和E表示,40个象素中各级灰度出现次数见表7-2。如果直接用二进制编码,则5个等级的灰度值需要3位表示,也就是每个象素用3位表示,编码这幅图像总共需要60 * 3 = 180位。按照香农理论,这幅图像的熵为H = (20/60)×log2(60/20) + (10/60)×log2 (60/10) + (5/60)×log2(60/5) + (15/60)×log2 (60/15) + (10/60) ×log2 (60/10) 即平均每个符号用2.189位表示就够
17、了,60个象素共需用131.33位,压缩比约为3 / 2.189 1.37 : 1。下面对该图像进行Huffman编码,参见图7-2和表7-3。CE(1/4)第1步: 0 1C(1/12) E(1/6)B(1/6)D(1/4)A(1/3)CE(1/4) BD(5/12)第2步: 0 1 0 1C(1/12) E(1/6)B(1/6)D(1/4)A(1/3) ACE(7/12) 01第3步: CE(1/4) BD(5/12) 01 0 1C(1/12) E(1/6)A(1/3) B(1/6) D(1/4) ABCDE(1) 0 1 ACE(7/12) 第4步: 01 CE(1/4)BD(5/12
18、) 01 0 1 C(1/12) E(1/6)A(1/3) B(1/6) D(1/4)图7-2 Huffman编码过程例符号次数(pi)log2(1/pi)编码需位数A20 (1/3)1.5850140B10 (1/6)851020C5 (1/12)3.58500015D15 (1/4)2.0001130E10 (1/6)8500130合计60 (1)135表7-3 Huffman算法举例表平均码长为135/60 = 2.25,压缩比为180/135 = 4/3 1.33 : 1。l 特点与问题哈夫曼编码的码长虽然都是可变的,但却不需要另外附加同步代码(即在译码时分割符号的特殊代码)。这时因为
19、每个符号都是二叉树的叶结点,它们都没有子节点(即某个符号编码开头的另一个符号编码)。如上例中,若哈夫曼编码的码串中的头两位为01,那末肯定是符号A,因为表示其他符号的代码没有一个是以01开始的,因此下一位就表示下一个符号代码的第1位。同样,如果出现“000”,那么它就代表符号C。如果事先编写出一本解释各种代码意义的“词典”,即码簿(H表),那么就可以根据码簿一个码一个码地依次进行译码。但是哈夫曼编码存在两个值得注意的问题:n 没有错误保护功能在译码时,如果码串中有哪怕仅仅是1位出现错误,则不但这个码本身译错,而且后面的码都会跟着错。称这种现象为错误传播,计算机对这种错误也无能为力,不能知道错误
20、出在哪里,更谈不上去纠正它。n 不能随机定位因是可变长度码,因此很难在压缩文件中直接对指定音频或图像位置的内容进行译码,这就需要在存储代码之前加以考虑。尽管存在上面这些问题,但哈夫曼编码还是得到了广泛应用。l H表与自适应哈夫曼编码利用哈夫曼方法进行编解码,在编码时需要计算造H表(哈夫曼表),存储和传输时需要存储和传输H表,解码时则需要查H表。有时为了加快编码速度、减少存储空间和传输带宽,可以对多媒体数据使用标准的H表,但其压缩率一般比计算所造的表稍低。所以,如果只关心编码速度、存储空间和传输带宽,可以采用标准H表方法;如果更关心压缩质量和压缩比,则可以自己计算造H表。即使是计算造表,也一般只
21、对高频符号计算编码,而对其他符号则直接编码。这种方法尤其适用于有大量不同的输入符号,但只有少数高频符号的情况。还有一种自适应哈夫曼编码(adaptive Huffman coding),不需要存储和传输H表,而是按与编码严格一致的方法建立同样的H表,还可以利用兄弟节点的特征来加快更新H树的过程。由于篇幅有限,这里就不做详细介绍。7.2.3 算术编码算术编码(arithmetic coding)是由P.Elias于1960年提出雏形、算法,由Rissanen和G.G.Langdon于1979年系统化并于1981年实现,最后由Rissanen于1984年完善并发布的一种无损压缩算法。从信息论上讲,
22、算术编码是与Huffman编码一样的最优变码长的熵编码。其主要优点是,克服了Huffman编码必须为整数位,这与实数的概率值相差大的缺点。如在Huffman编码中,本来只需要0.1位就可以表示的符号,却必须用1位来表示,结果造成10 倍的浪费。算术编码所采用的解决办法是,不用二进制代码来表示符号,而改用0,1)中的一个宽度等于其出现概率的实数区间来表示一个符号,符号表中的所有符号刚好布满整个0,1)区间(概率之和为1,不重不漏)。把输入符号串(数据流)映射成0,1)区间中的一个实数值。l 编码方法符号串编码方法:将串中使用的符号表按原编码(如字符的ASCII编码、数字的二进制编码)从小到大顺序
23、排列成表,计算表中每种符号si出现的概率pi,然后依次根据这些符号概率大小pi来确定其在0, 1)期间中对应的小区间范围xi, yi):其中,p0 = 0。显然,符号si所对应的小区间的宽度就是其概率pi。参见图7-3。s1s2. si. sm0|x1 p1 y1|x2 p2 y2 . xi pi yi . xm pm ym|1图7-3 算术编码的字符概率区间然后对输入符号串进行编码:设串中第j个符号cj为符号表中的第i个符号si,则可根据si在符号表中所对应区间的上下限xi和yi,来计算编码区间Ij = lj, rj):其中,dj = rj - lj为区间Ij的宽度,l0 = 0,r0 =
24、1,d0 = 1。显然,lj而dj与rj。串的最后一个符号所对应区间的下限ln就是该符号串的算术编码值。l 例子例如:输入符号串为“helloworld”(10个字符),符号表含7个符号,按字母顺序排表7-4 符号表(符号及其概率与区间)列,容易计算它们各自出现概率和所对应的区间。表7-4是符号序号符号pixi, yi)1d0.0, 0.1)2e0.1, 0.2)3h0.2, 0.3)4l0.3, 0.6)5o0.6, 0.8)6r0.8, 0.9)7w0.9, 1.0)表及其符号的概率和对应区间。表7-5则是对输入符号串“helloworld”的编码过程,编码输出为l10 = 0.21461
25、57880。算术编码的过程,也可以用图7-4所示的逐步映射来表示。表7-5 算术编码的编码过程表序号符号liridi0初值1h2e3l4l5o6w7o8r9l10d0de h lo r w0.0 0.1 0.20.3 0.6 0.8 hdhe hh hlho hr hw0.2 hedhee heh hel heo herhew111 12 13 16 18 19 0.22heldhele helh hell helo helrhelw13 33 136 139 148 154 157 0.216 helloworl0.21461568 helloworld 0.2146157880 输出 图7
26、-4 算术编码的过程l 解码方法由符号表(包括符号对应的概率与区间)和实数编码ln,可以按下面的解码算法来重构输入符号串:设v1 = ln = 码值若vj xi , yi) cj = si , j = 1, , nvj+1 = (vj - xi) / pi , j = 1, , n-1例如上例的解码过程见表7-6。重构输入符号串为v10 = “helloworld”。jvjicj = si13h22e34l4(0.4615788 - 0.3) / 0.3 = 4l5( - 0.3) / 0.3 = 5o6( - 0.6) / 0.2 = 7w7( - 0.9) / 0.1 = 5o8( - 0
27、.6) / 0.2 = 0.836r9(0.83 - 0.8) / 0.1 = 0.34l10(0.3 - 0.3) / 0.3 = 0.01d表7-6 算术编码的解码过程表l 若干说明在算术编码中需要注意的几个问题:(1) 由于实际计算机的浮点运算器不够长(一般为80位),可用定长的整数寄存器低进高出来接收码串,用整数差近似实数差来表示范围,但可能会导致误差积累。(2) 算术编码器对整个消息只产生一个码字,这个码字是在间隔0, 1)中的一个实数,因此译码器在接受到表示这个实数的所有位之前不能进行译码。(3) 算术编码也是一种对错误很敏感的编码方法,如果有一位发生错误就会导致整个字符序列被译错
28、。算术编码可以是静态的或者自适应的。在静态算术编码中,信源符号的概率是固定的。在自适应算术编码中,信源符号的概率根据编码时符号出现的频繁程度动态地进行修改。需要开发动态算术编码的原因是因为事先知道精确的信源概率是很难的,而且是不切实际的。当压缩数据时,我们不能期待一个算术编码器获得最大的效率,所能做的最有效的方法是在编码过程中估算概率,它成为确定编码器压缩效率的关键。 RLE行程编码RLE(Run Length Encoding,游程长度编码)是一种使用广泛的简单熵编码,它被用于BMP、JPEG/MPEG、TIFF和PDF等编码之中,还被用于传真机。l RLE的编码方法RLE视数字信息为无语义
29、的字符序列(字节流),对相邻重复的字符,用一个数字表示连续相同字符的数目(称为行程长度),可达到压缩信息的目的。如未压缩的数据:ABCCCCCCCCDEFFGGGRLE编码:AB8CDEFF3G对比该RLE编码例前后的代码数可以发现,在编码前要用17个代码表示的数据,而编码后只要用10个代码,压缩比为1.7 : 1。这说明RLE确实是一种压缩技术,而且这种编码技术相当直观,也非常经济。RLE所能获得的压缩比有多大,这主要是取决于数据本身的特点。如果图像数据(如人工图形)中具有相同颜色的图像块越大,图像块数目越少,获得的压缩比就越高。反之(如自然照片),压缩比就越小。RLE译码采用与编码相同的规
30、则,还原后得到的数据与压缩前的数据完全相同。因此,RLE是一种无损压缩技术。RLE压缩编码特别适用于计算机生成的图形,对减少这类图像文件的存储空间非常有效。然而,RLE对颜色丰富多变的自然图像就显得力不从心,这时在同一行上具有相同颜色的连续像素往往很少,而连续几行都具有相同颜色值的连续行数就更少。如果仍然使用RLE编码方法,不仅不能压缩图像数据,反而可能使原来的图像数据变得更大。但是,这并不意味着RLE编码方法在自然图像的压缩中毫无用处,恰恰相反,在各种自然图像的压缩方法中(如JPEG),仍然不可缺少RLE。只不过,不是单独使用RLE一种编码方法,而是和其他压缩技术联合应用。l BMP中的RL
31、E1编码在BMP文件中,对16色和256色的普通格式的位图可进行RLE压缩(BI_RLE4和BI_RLE8),编码由若干信息单位构成,每个信息单位有2个字节。第一字节>0:重复的象素数第二字节BI_RLE8:一个颜色索引值(8b)BI_RLE4:两个颜色索引值(高4位为第一个象素,低4位为第二个象素)表7-7 BMP的RLE编码信息单位的组成1信息单位的第一个字节一般为同一色索引的象素数,这时第二个字节对BI_RLE8为一个颜色索引(8b),对BI_RLE4为两个颜色索引(各4b,高4位为第一个象素,低4位为第二个象素)。参见表7-7。第一字节0:特殊含义第二字节0:线结束1:位图结束2
32、:偏移(后跟的两个字节分别表示从当前位置向右和向下偏移的象素数)?3255:后跟的未压缩的象素(色索引)数表7-8 BMP的RLE编码信息单位的组成2若信息单位的第一个字节为0,这时,第二个字节表示特殊意义:0线结束、1位图结束、2偏移(后跟的两个字节分别表示从当前位置向右和向下偏移的象素数)、3255后跟的未压缩的象素(色索引)数(填充到双字节边界,不足时补0)。参见表7-8。2例子1)BI_RLE8Compressed data Expanded data03 04 04 04 04 05 06 06 06 06 06 06 00 03 45 56 67 00 45 56 67 02 78
33、 78 78 00 02 05 01 Move 5 right and 1 down 02 78 78 78 00 00 End of line 09 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 00 01 End of RLE bitmap2)BI_RLE4Compressed data Expanded data03 04 0 4 005 06 0 6 0 6 0 00 06 45 56 67 00 4 5 5 6 6 7 04 78 7 8 7 8 00 02 05 01 Move 5 right and 1 down 04 78 7 8 7 8 00 00 End of
34、 line 09 1E 1 E 1 E 1 E 1 E 100 01 End of RLE bitmap LZW算法(逻辑更简单、速度更快、硬件实现更廉价),因此人们把这种编码方法称为LZW(Lempel-Ziv Walch)算法。图7-5 第二类词典编码概念LZW属于第二类词典编码,该类词典编码的思路是试图从输入的数据中创建一个“短语词典”,这里的“短语”(phrases,词汇/单词)可是任意字符的组合。编码数据过程中当遇到已经在词典中出现的“短语”时,编码器就输出这个词典中的短语的“索引号”,而不是短语本身,参见图7-5。LZW算法被GIF和PNG图像所采用,并被广泛应用于文件的压缩打包(
35、如ZIP和RAR)和磁盘压缩。l 编码算法LZW算法是一种基于字典的编码将变长的输入符号串映射成定长的码字形成一本短语词典索引(串表),利用字符出现的频率冗余度及串模式高使用率冗余度达到压缩的目的。该算法只需一遍扫描,且具有自适应的特点(从空表开始逐步生成串表,码字长从象素位数n+1逐步增加到12),不需保存和传送串表。串表具有前缀性若串wc(w为字符串,c为字符)在表中,则串w也在串表中(所以,可初始化串表为含所有单个字符的串)。匹配采用贪婪算法每次只识别与匹配串表中最长的已有串w(输出对应的码字)、并可与下一输入字符c拼成一个新的码字wc。对串表的改进:用w的码字来代替wc中的w,则串表中
36、的串等长;当串表已满时(一般表长为212),可清表重来(输出清表码字)。清表码字=2n,结束码字=1+2n。所以,第一个可用的多字符串的码字=2+2n。n LZW压缩算法:初始化:将所有单个字符的串放入串表ST中;(共2n项码字为02n-1,实际操作时不必放入,只需空出串表的前2n项,字符对应码字所对应的串表索引即可)读首字符入前缀串w;设置码长codeBits=n+1;设置串表中当前表项的索引值next=初始码字=2n+2;循环:读下一输入字符c;若c=EOF(文件结束符),则输出w的码字,结束循环(输出结束码字);若wc已在串表中,则w=wc,转到循环开始处;否则,输出w的码字,将wc放入
37、ST中的next处,next+;令w=c,转到循环开始处;若next的位数超过码长(>codeBits),则codeBits+;若串表已满(next的位数已超过最大码长12),则清空串表,输出清表码字,转到初始化开始处。n LZW还原算法:初始化:将所有单个字符的串放入串表ST中;(共2n项码字为02n-1,实际操作时不必放入,只需空出串表的前2n项,字符对应码字对应串表索引即可)串表中当前表项的索引next=2n+2;设置码长codeBits=n+1;读首个码字(所对应的单个字符)入老串old,输出该字符;循环:读下一码字new;若new=结束码字,结束循环;若new=清表码字,则清空
38、串表,转到初始化开始处;若new>=next,则输出串newStr= old+old0(例外处理);若new<next,则输出串newStr;将old+newStr0放入串表STnext中,next+;若next的位数超过码长(>codeBits),则codeBits+;但若加一后的codeBits > 12,则重新让codeBits = 12;old=newStr,转到循环开始处。其中:newStr=STnew(即串表中索引为new的串)表7-9 编码字符串l 例子位置123456789字符ABBABABAC被编码字符串见表7-9,它只包含3个不同的单字符A、B、C。
39、步骤码字词典输出(1)A(2)B(3)C1(1)-A2(2)(4)ABB3(2)(5)BBB4(4)(6)BAAB5(7)(7)ABAABA6(3)(8)ABACC步骤位置词典输出(1)A(2)B(3)C11(4)AB(1)22(5)BB(2)33(6)BA(2)44(7)ABA(4)56(8)ABAC(7)6-(3)表7-10 LZW的编码过程 表7-11 LZW的译码过程编码过程如表7-10,其中:“步骤”栏表示编码步骤、“位置”栏表示在输入数据中的当前位置、“词典”栏表示添加到词典中的缀符串,它的索引在括号中、“输出”栏表示码字输出。译码过程如表7-11。每个译码步骤译码器读一个码字,输
40、出相应的缀符串,并把它添加到词典中。例如,在步骤4中,先前码字(2)(对应于单字符串“B”)存储在老码字(old)中,当前码字(new)是(4),对应的当前缀符串newStr是输出(“AB”),先前缀符串old ("B")加上当前缀符串newStr ("AB")的第一个字符“A”,其结果old+newStr0("BA") 添加到词典中(STnext),它的索引号next是(6) 。表7-9 编码字符串l GIF文件格式可交换图形格式(GIF=Graphics Interchange Format),由CompuServe公司于87年起
41、定义,现有87a与89a两个主要版本,采用变长LZW压缩算法,只支持索引色(最多8位)。GIF文件的格式见表7-1219(其中,多字节整数的低位在前,无符号)。内容大小取值标识3B必须为”GIF”版本3B”87a”或”89a”图像宽度2B象素数图像高度2B象素数全局标志1B定全局色表选项背景色索引1B用于图外色象素纵横比1B一般为0全局色表N*3B可选,每项为RGB数据块变长可多个GIF结束符1B;(59,0x3B)表7-14 数据块格式1(图像块)表7-12 GIF文件格式表7-13 全局标志位名称大小含义02pixel3bpixelBits-13reserved (87a)1b保留,必须为
42、0sort (89a)=0色表未排序=1色表已按重要性排序46cr3bcolorBits-17M1b=0无全局色表=1有全局色表表7-15 局部标志其中:n 像素位数n=pixelBits=pixel+1=颜色位数colorBits=cr+1= 18n 颜色数N=2pixelBits=2colorBits=2(18)n 象素纵横比:若=0,则Aspect Ratio为1:1;若>0,则Aspect Ratio = (Pixel Aspect Ratio + 15) / 64内容大小取值图像分隔符1B,(44,0x2C)图像左边左上角坐标2B象素数图像顶端2B象素数图像宽度2B象素数图像高
43、度2B象素数局部标志1B定局部色表及交叉选项编码长度1B位数局部色表N*3B可选,RGB数据子块子块大小bc1B可选,可多个图像编码bcB子块序列结束符1B0(大小为0的子块)位名称大小含义02pixel3bpixelBits-134reserved2b保留,必须为05reserved (87a)1b保留,必须为0sort (89a)=0色表未排序=1色表已按重要性排序6I1b=0顺序编码=1行交叉编码7M1b=0用全局色表=1有局部色表其中:象素位数n=pixelBits=pixel+1=18,颜色数N=2pixelBits=2(18) I=1时为行交叉编码(用于渐显),行的交叉顺序为(4遍扫描):第一遍:0行、8行、8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论