基于游程编码数据压缩算法设计与实现.docx
- 文档编号:10829323
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:77
- 大小:380.69KB
基于游程编码数据压缩算法设计与实现.docx
《基于游程编码数据压缩算法设计与实现.docx》由会员分享,可在线阅读,更多相关《基于游程编码数据压缩算法设计与实现.docx(77页珍藏版)》请在冰豆网上搜索。
基于游程编码数据压缩算法设计与实现
本科毕业设计(论文)
基于游程编码数据压缩算法的设计与实现
2013年6月
摘要
本次毕业设计主要是针对于游程编码数据压缩算法的设计与实现,游程编码非常简单,编码、解码速度快,应用广泛。
游程编码是针对于二元序列的一种编码方法,对于二值图像而言是一种编码方法,对连续的黑、白像素数(游程)以不同的码字进行编码。
游程编码是一种简单的非破坏性资料压缩法,其好处是加压缩和解压缩都非常快。
其方法是计算连续出现的资料长度压缩之,其缺点是对于不重复的资料反而加大容量。
游程编码即需大量的缓冲和优质信道,所以对数据游程编码后在进一步的进行哈夫曼编码已达到更完善的数据压缩。
哈夫曼编码使用变长编码表对源符号进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。
本文主要介绍了信源编码的分类、获得最佳编码的方法、哈夫曼树的构建方法以及游程编码的原理和实现技术,对游程长度编码技术做了较为全面地研究。
包括游程数据压缩、解压缩过程,并给出了流程图;哈夫曼数据压缩、解压缩过程,并给出流程图和结果图。
关键词 游程编码哈夫曼编码压缩
Abstract
Thisgraduationdesignismainlybasedonrun-lengthcodingdatacompressionalgorithmdesignandimplementationofrun-lengthcodingisverysimple,encodinganddecodingspeed,wideapplication.Run-lengthcodingisacodingmethodforbinarysequence,isakindofcodingmethodforbinaryimage,theblackandwhitepixelsofcontinuous(run)indifferentcodecodeword.Run-lengthcodingisakindofsimplenondestructivedatacompressionmethod,theadvantageisthatofcompressionanddecompressionareveryfast.Itsmethodistocalculateacontinuouslengthofdatacompression,thedownsideistonotrepeatdatainsteadofincreasingcapacity.Run-lengthcodingisneedalotofbufferandchannel,sothedataaftertherun-lengthcodinginfurtherHuffmanencodinghasreachedmore.
Sourcecodingismainlyintroducedinthispapertheclassification,theoptimalmethodofcoding,Huffmantree,constructionmethods,andtherun-lengthcodingprincipleandimplementationtechnology,thelengthoftherun-lengthencodingtechnologyisdonemorecomprehensiveresearch.Includingtherun-lengthdatacompressionanddecompressionprocess,andgivestheflowchart;Huffmandatacompressionanddecompressionprocess,chartandflowchartisgivenandtheresults.
Keywords Run-lengthcodingHuffmanencodingThecompression
第1章绪论
1.1课题背景
信息时代人们对使用计算机获取信息、处理信息的依赖性越来越高。
多媒体计算机系统面临的是数值、文字、语言、音乐、图形、动画、静图像、电视视频图像等多种媒体承载的由模拟量转化成数字量信息的吞吐、存储和传输的问题。
数字化了的视频和音频信号的数量之大是惊人的,与硬件技术所能提供的计算机存储资源和网络带宽之间有很大差距[1]。
这样,对多媒体信息的存储和传输造成了很大困难,成为阻碍人们有效获取和利用信息的一个瓶颈问题。
多媒体信息使用的前提是进行有效的压缩。
例如一段时间长度为1min,图像尺寸为640×480pixete,每秒播放30帧的非压缩彩色24位真彩色视频的信息量为:
640×480×3×30×60:
1658880000Bytes,约为1.6GB(未含音频信息的容量),如果用650MB的CD-R来存放,需要3张。
由此可见,在视频信息的处理及应用过程中压缩及解压缩技术是十分必要的[2]。
数据压缩技术主要采用两种方法:
一种是“保真率”较高的无损压缩法;另一种是以损失信息细节而换取较高压缩比的有损压缩法。
无损压缩虽然压缩比不是很高,但还原后的文件与原数据文件完全相同,从而保证了信息细节的不失真,常用的方法有统计式压缩法和字典式压缩法,统计式压缩法的编码方案主要是霍夫曼(Hufman)编码、算术编码(AC)和游程长度编码(RLC)[2]。
其中,游程长度编码是一种十分简单的压缩方法,编码/解码的速度也非常快,因此得到了广泛的应用。
许多图形和视频文件,如BMP,.TIF及.AVI等,都采用了这种压缩方法,尤其适用于文本(文件)数据压缩,它主要是去除文本中的冗余字符或字节中的冗余位以达到减少数据文件所占的存储空间的目的[6]。
飞速发展的数据压缩和图像编码技术,给多媒体数据传输和数据存储带来极大的快捷和便利。
但在某些数据安全性要求比较苛刻的领域,现在比较流行和压缩效果好的压缩算法几乎都属于有损范畴,对原始数据压缩处理后有不同程度的损伤,无法完全恢复,以至于不能满足技术要求,现有的无损压缩方法,如Huffman、LZ系列、算术编码等压缩方法尽管在某些方面各有优点,但压缩效果比较差或者算法实现比较困难,因此十分有必要对无损压缩算法进行研究[4]。
通过对游程编码(RunLengthEncoding,RLE)进行研究,结合哈夫曼编码。
最后找到一种实现相对简单、压缩效果比较好的方法,即对游程编码后的数据在进一步的进行哈夫曼编码,采用该方法可以收到比较理想的效果。
1.2选题目的、意义
飞速发展的数据压缩和图像编码技术,给多媒体数据传输和数据存储带来极大的快捷和便利。
但在某些数据安全性要求比较苛刻的领域,现在比较流行和压缩效果好的压缩算法几乎都属于有损范畴,对原始数据压缩处理后有不同程度的损伤,无法完全恢复,以至于不能满足技术要求,现有的无损压缩方法,如Huffman、LZ系列、算术编码等压缩方法尽管在某些方面各有优点,但压缩效果比较差或者算法实现比较困难,而游程编码却是一种是一种非常简单,且编码、解码速度很快编码方法。
所以通过对于游程编码的研究能够比较快捷语简单的实现对于数据的无损压缩。
1.3主要内容
本文主要介绍了信源编码中的几种最佳变长编码方法:
香农(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码,以及这几种编码的编码过程。
然后主要描述了哈夫曼编码方法以及如何构造哈夫曼树。
然后详细的介绍了游程编码的编码算法以及游程编码的特点。
画出游程编码哈夫曼编码的流程图,以及得出的结果图,最后做出总结。
第2章信源编码分类
2.1信源编码
2.1.1信源编码简介
编码实质上就是对信源的原始符号按一定规则进行的一种变换。
编码可分为信源编码和信道编码。
由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。
具体的说就是针对信源输出符号序列的统计特性,寻找一定的方法把信源输出符号序列变换为最短码字序列的方法。
信源编码的基本途径有两个:
使序列中的各个符号尽可能地相互独立,即解除相关性;使编码中各个符号出现的概率尽可能地相等,即概率均匀化。
采用的一般方法是压缩每个信源符号的平均比特数或信源的码率。
即同样多的信息用较少的码率传送,使单位时间内传送的平均信息量增加,从而提高通信的有效性[3]。
2.1.2信源编码的理论基础
信源编码就是从信源符号到码符号的一种映射f,它把信源输出的符号ui变换成码元序列wi。
信源编码定义如图2-1:
图2-1信源编码定义图
信源编码理论是信息论的一个重要分支,其理论基础是信源编码的两个定理。
无失真信源编码定理:
是离散信源/数字信号编码的基础;限失真信源编码定理:
是连续信源/模拟信号编码的基础。
2.1.3信源编码的分类及作用
信源编码的分类:
离散信源编码:
独立信源编码,可做到无失真编码;连续信源编码:
独立信源编码,只能做到限失真信源编码;相关信源编码:
非独立信源编码。
编码的作用:
信源编码的作用之一是设法减少码元数目和降低码元速率,即通常所说的数据压缩:
作用之二是将信源的模拟信号转化成数字信号,以实现模拟信号的数字化传输。
2.1.4信源编码的历史
最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。
但现代通信应用中常见的信源编码方式有:
Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。
信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。
另外,在数字电视领域,信源编码包括通用的MPEG—2编码和H.264(MPEG—Part10AVC)编码等相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力[4]。
2.2最佳变长编码
凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字称为最佳变长码。
为此必须将概率大的信息符号编以短的码字,概率小的符号编以长的码字,使得平均码字长度最短。
能获得最佳编码的方法主要有:
香农(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。
2.2.1香农编码方法
香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。
如何构造这种码?
香农第一定理指出,选择每个码字的长度Ki满足下式
I(xi)≤K﹤I(xi)+1,
(2-1)
就可以得到这种码。
这种编码方法就是香农编码。
香农编码法冗余度稍大,实用性不大,但有重要的理论意义。
编码步骤如下:
1)将信源消息符号按其出现的概率大小依次排列
p(x1)≥p(x2)≥…≥p(xn)(2-2)
2)确定满足下列不等式整数码长Ki:
-log2p(xi)≤Ki<-log2p(xi)+1(2-3)
3)为了编成唯一可译码,计算第i个消息的累加概率
Pi=
p(xk)(2-4)
4)将累加概率Pi变成二进制数。
5)取Pi二进制数的小数点后Ki位即为该消息符号的二进制码字。
设信源共7个符号消息,其概率和累加概率如表2-1,则其香农编码过程如表2-1。
所以信源符号的平均码长为:
(2-5)
平均信息传输率即编码效率为:
(2-6)
表2-1香农编码过程
信源消息符号Ai
符号概率
P(Ai)
累加概率Pi
-logp(Ai)
码字长度Ki
码字
A1
A2
A3
A4
A5
A6
A7
0.20
0.19
0.18
0.17
0.15
0.10
0.01
0
0.2
0.39
0.57
0.74
0.89
0.99
2.34
2.41
2.48
2.56
2.74
3.34
6.66
3
3
3
3
3
4
7
000
001
011
100
101
1110
1111110
2.2.2费诺编码方法
费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率大,编码效率高,但它属于概率匹配编码它不是最佳的编码方法。
费诺编码步骤:
(1)将信源消息符号按其出现的概率大小依次排列:
。
(2)将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
(3)将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
(4)如此重复,直至每个组只剩下一个信源符号为止。
(5)信源符号所对应的码字即为费诺码。
对表2-1中信源消息进行费诺编码,则编码过程如表2-2。
则该费诺编码的平均码长:
(2-7)
信息传输速率
(2-8)
表2-2费诺编码过程
消息符号Ai
消息概率
P(Ai)
第一次分组
第二次分组
第三次分组
第四次分组
二元码字
码长Ki
A1
0.20
0
0
00
2
A2
0.19
1
0
010
3
A3
0.18
1
011
3
A4
0.17
1
0
10
2
A5
0.15
1
0
110
3
A6
0.10
1
0
1110
4
A7
0.01
1
1111
4
显然费诺码要比上述香农码的平均码长小,消息传输速率大,说明编码效率高。
2.2.3哈夫曼编码方法
哈夫曼编码是一种常见的压缩方法。
它的基本原理是按照信号出现概率大小顺序排列信源信号,并设法按逆序分配码字字长,使编码的码字是可辨识的。
哈夫曼编码步骤:
(1)首先把信源中的消息出现的频率从小到大排列。
(2)每一次选出频率最小的两个值,作为二叉树的两个叶子节点,将和作为它们的根节点,这两个叶子节点不再参与比较,新的根节点参与比较。
(3)重复
(2),直到最后得到和为1的根节点。
(4)将形成的二叉树的左节点标0,右节点标1。
把从最上面的根节点到最下面的叶子节点途中遇到的0,1序列串起来,就得到了各个符号的编码。
对表2-1中的信源数据进行哈夫曼编码,编码过程如表2-3。
表2-3哈夫曼编码过程
信源符号Ai
概率p(Ai)
编码过程
码字Wi
码长Ki
A1
0.20
0.260.350.390.6101
10
2
A2
0.19
0.200.260.3500.391
11
2
A3
0.18
0.190.2000.261
000
3
A4
0.17
0.1800.191
001
3
A5
0.15
00.171
010
3
A6
0.10
01
0110
4
A7
0.01
1
0111
4
该哈夫曼码的平均码长为
(2-9)
信息传输速率
(2-10)
由此可见,哈夫曼编码的平均码长最小,消息传输速率最大,编码效率最高。
哈夫曼编码是用概率匹配方法进行信源编码。
他有两个明显的特点:
一是哈夫曼码的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长吗,充分利用了短码;二是缩减信源的最后两个码字总是最后一位不同,从而保证哈夫曼编码是即时码[6]。
哈弗曼编码几乎是所有压缩算法的基础,其实这个算法并不复杂,简单的理解就是,如何用更短的bit来编码数据。
我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit:
字符
编码
A
00101001
B
00101010
C
00101011
...
...
这样,计算机就能很方便的把由0和1组成的数据流解析成原始信息,但我们知道,在很多情况下,数据文件中的字符出现的概率是不均匀的,比如在一篇英语文章中,字母“E”出现的频率最高,“Z”最低,如果我们使用不定长的bit编码,频率高的字母用比较短的编码表示,频率低的字母用长的编码表示,岂不是可以大大缩小文件的空间吗?
但这就要求编码要符合“前缀编码”的要求,即较短的编码不能是任何较长的编码的前缀,这样解析的时候才不会混淆,比如下面的编码方法就符合前缀原则:
字符
编码
A
0
B
10
C
110
D
1110
E
11110
...
...
根据这个码表,下面一段数据就可以唯一解析成原始信息了:
1110010101110110111100010–DABBDCEAAB
要生成这种编码,最方便的就是用二叉树,考察一下下面这个树
图2-2二叉树图
把要编码的字符放在二叉树的叶子上,所有的左节点是0,右节点是1,从根浏览到叶子上,因为字符只能出现在树叶上,任何一个字符的路径都不会是另一字符路径的前缀路径,符合前缀原则编码就可以得到
字符
编码
A
00
B
010
C
011
D
10
E
11
现在我们可以开始考虑压缩的问题,如果有一篇只包含这五个字符的文章,而这几个字符的出现的次数如下:
A:
6次
B:
15次
C:
2次
D:
9次
E:
1次
用过用定长的编码,每个字符3bit,这篇文章总长度为:
3*6+3*15+3*2+3*9+3*1=99(2-11)
而用上面用二叉树生成的编码,总长度为:
2*6+3*15+2*2+2*9+2*1=80(2-12)
显然,这颗树还可以进一步优化,使得编码更短,比如下面的编码
图2-3二叉树图
生成的数据长度为:
3*6+1*15+4*2+2*9+4*1=63(2-13)
可以看出,构造更优的二叉树,原则就是权重越大的叶子,距离根应该越近,而我们的终级目标是生成“最优”的二叉树,最优二叉树必须符合下面两个条件:
所有上层节点都大于等于下层节点。
某节点,设其较大的子节点为m,较小的子节点为n,m下的任一层的所有节点都应大于等于n下的该层的所有节点。
上面这个例子是比较简单的,实际的文件中,一个字节有256种可能的取值,所以二叉树的叶子节点多达256个,最终的树形可能非常复杂,但有一种非常精巧的算法可以快速地建起一棵最优二叉树,这种算法由D.Huffman(戴?
哈夫曼)提出,下面我们先来介绍哈弗曼算法的步骤,然后再来证明通过这么简单的步骤得出的树形确实是一棵最优二叉树。
哈夫曼算法的步骤是这样的:
从各个节点中找出最小的两个节点,给它们建一个父节点,值为这两个节点之和。
然后从节点序列中去除这两个节点,加入它们的父节点到序列中。
重复上面两个步骤,直到节点序列中只剩下唯一一个节点。
这时一棵最优二叉树就已经建成了,它的根就是剩下的这个节点。
比如上面的例子,哈弗曼树建立的过程如下:
1)列出原始的节点数据:
图2-4原始节点
2)将最小的两个节点C和E结合起来:
图2-5C和E结合
3)再将新的节点和A组合起来
图2-6新节点结合图
4)再将D节点加入
图2-7新节点结合图
5)如此循环,最终得到一个最优二叉树
图2-8最优二叉树图
生成的数据文件长度为:
3*6+1*15+4*2+2*9+4*1=63
下面我们用逆推法来证明对于各种不同的节点序列,用哈弗曼算法建立起来的树总是一棵最优二叉树:
当这个过程中的节点序列只有两个节点时(比如前例中的15和18),肯定是一棵最优二叉树,一个编码为0,另一个编码为1,无法再进一步优化。
然后往前步进,节点序列中不断地减少一个节点,增加两个节点,在步进过程中将始终保持是一棵最优二叉树,这是因为:
按照哈弗曼树的建立过程,新增的两个节点是当前节点序列中最小的两个,其他的任何两个节点的父节点都大于(或等于)这两个节点的父节点,只要前一步是最优二叉树,其他的任何两个节点的父节点就一定都处在它们的父节点的上层或同层,所以这两个节点一定处在当前二叉树的最低一层。
这两个新增的节点是最小的,所以无法和其他上层节点对换。
符合我们前面说的最优二叉树的第一个条件。
只要前一步是最优二叉树,由于这两个新增的节点是最小的,即使同层有其他节点,也无法和同层其他节点重新结合,产生比它们的父节点更小的上层节点来和同层的其他节点对换。
它们的父节点小于其他节点的父节点,它们又小于其他所有节点,只要前一步符合最优二叉树的第二个条件,到这一步仍将符合。
这样一步步逆推下去,在这个过程中哈弗曼树每一步都始终保持着是一棵最优二叉树。
2.3游程编码
2.3.1游程长度
游程长度RL(Run-Length),简称游程或游长,指的是由字符(或信号取样值)构成的数据流中各个字符重复出现而形成的字符的长度。
如果给出了形成串的字符,串的长度以及串的位置,就能恢复出原来的数据流,游程长度编码(RLC)就是用二进制码字给出这些信息的一类方法。
2.3.2游程编码算法
游程编码的基本原理是:
用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“游程”,游程编码因此而得名),使符号长度少于原始数据的长度。
只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。
在二元序列中,只有两种符号,即“0”和“1”,这些符号可连续出现,连“0”这一段称为“0”游程,连“1”这一段称为“1”游程。
它们的长度分别称为游程长度L(0)和L(l)。
“0”游程和“l”游程总是交替出现的。
如果规定二元序列是以“0”开始,第一个游程是“0”游程,第二个必为“1”游程,第三个又是“0”游程等等。
对于随机的二元序列,各游程长度将是随机变量,其取值可为1,2,3,…,直到无限。
将任何(二元)序列变换成一一对应的游程长度序列,再按哈夫曼编码或其他方法处理以达到压缩码率的目的[9]。
2.3.3游程编码特点
游程编码仍是变长码,有其固有的缺点,及需要大量的缓冲和优质的信道。
此外,编程长度可以从一直到无限,这在码字的选择和码表的建立方面都有困难,实际应用是尚需采用某些措施来改进。
一般情况下游程长度越长,其概率越小,这在以前的计算中也可以看见,而且将随着长度的增大渐进向零。
对于小概率的码字,其长度为达到概率匹配或较长,损失不会太大,也就是对平均码字长度影响较小。
再按哈夫曼编码或其他方法处理以达到压缩码率的目的。
2.3.4几种基于游程相关性的数据压缩方案
1)共前缀码
共前缀码编码时也是按照一定规律用尽量短的码字来表示游程形式的初始测试数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 游程 编码 数据压缩 算法 设计 实现