资源描述:
《数据压缩实验指导书.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、目录实验一用C/C++语言实现游程编码2实验二用C/C++语言实现算术编码4实验三用C/C++语言实现LZW编码10实验四用C/C++语言实现2D-DCT变换1314实验一用C/C++语言实现游程编码1.实验目的1)通过实验进一步掌握游程编码的原理;2)用C/C++语言实现游程编码。2.实验要求给出数字字符,能正确输出编码。3.实验内容现实中有许多这样的图像,在一幅图像中具有许多颜色相同的图块。在这些图块中,许多行上都具有相同的颜色,或者在一行上有许多连续的象素都具有相同的颜色值。在这种情况下就不需要存储每一个象素的颜色值,而仅仅存储一个象素的颜色值,以及具有相同颜色的
2、象素数目就可以,或者存储一个象素的颜色值,以及具有相同颜色值的行数。这种压缩编码称为游程编码,常用(runlengthencoding,RLE)表示,具有相同颜色并且是连续的象素数目称为游程长度。为了叙述方便,假定一幅灰度图像,第n行的象素值为:用RLE编码方法得到的代码为:0@81@38@501@40@8。代码中用黑体表示的数字是游程长度,黑体字后面的数字代表象素的颜色值。例如黑体字50代表有连续50个象素具有相同的颜色值,它的颜色值是8。对比RLE编码前后的代码数可以发现,在编码前要用73个代码表示这一行的数据,而编码后只要用11个代码表示代表原来的73个代码,压缩
3、前后的数据量之比约为7:1,即压缩比为7:1。这说明RLE确实是一种压缩技术,而且这种编码技术相当直观,也非常经济。RLE所能获得的压缩比有多大,这主要是取决于图像本身的特点。如果图像中具有相同颜色的图像块越大,图像块数目越少,获得的压缩比就越高。反之,压缩比就越小。译码时按照与编码时采用的相同规则进行,还原后得到的数据与压缩前的数据完全相同。因此,RLE是无损压缩技术。14RLE压缩编码尤其适用于计算机生成的图像,对减少图像文件的存储空间非常有效。然而,RLE对颜色丰富的自然图像就显得力不从心,在同一行上具有相同颜色的连续象素往往很少,而连续几行都具有相同颜色值的连续
4、行数就更少。如果仍然使用RLE编码方法,不仅不能压缩图像数据,反而可能使原来的图像数据变得更大。请注意,这并不是说RLE编码方法不适用于自然图像的压缩,相反,在自然图像的压缩中还真少不了RLE,只不过是不能单纯使用RLE一种编码方法,需要和其他的压缩编码技术联合应用。4、思考题:①如果是英文字符,应该从哪几方面去进行考虑?②是否所有的字符都要RLE编码方法来进行编码?③如何区分字符与重复因子?14实验二用C/C++语言实现算术编码1.实验目的1)通过实验进一步掌握算术编码的原理;2)用C/C++语言实现算术编、解码。2.实验要求1)能正确进行码字刷新及区间刷新;2)合理
5、输出码字;3)能正确解码。3.实验内容[过程1]假设信源符号为{00,01,10,11},这些符号的概率分别为{0.1,0.4,0.2,0.3},根据这些概率可把间隔[0,1)分成4个子间隔:[0,0.1),[0.1,0.5),[0.5,0.7),[0.7,1),其中表示半开放间隔,即包含不包含。上面的信息可综合在表1中。表1信源符号,概率和初始编码间隔符号00011011概率0.10.40.20.3初始编码间隔[0,0.1)[0.1,0.5)[0.5,0.7)[0.7,1)如果二进制消息序列的输入为:10001100101101。编码时首先输入的符号是10,找到它的编
6、码范围是[0.5,0.7)。由于消息中第二个符号00的编码范围是[0,0.1),因此它的间隔就取[0.5,0.7)的第一个十分之一作为新间隔[0.5,0.52)。依此类推,编码第3个符号11时取新间隔为[0.514,0.52),编码第4个符号00时,取新间隔为[0.514,0.5146),…。消息的编码输出可以是最后一个间隔中的任意数。整个编码过程如图1所示。14图1算术编码过程举例这个例子的编码和译码的全过程分别表示在表4-05和表4-06中。根据上面所举的例子,可把计算过程总结如下。考虑一个有M个符号的字符表集,假设概率,而。输入符号用表示,第个子间隔的范围用表示。
7、其中,和,表示间隔左边界的值,表示间隔右边界的值,表示间隔长度。编码步骤如下:步骤1:首先在1和0之间给每个符号分配一个初始子间隔,子间隔的长度等于它的概率,初始子间隔的范围用[,)表示。令,和。步骤2:L和R的二进制表达式分别表示为:和其中和等于“1”或者“0”。比较和:①如果,不发送任何数据,转到步骤3;②如果,就发送二进制符号。比较和:①如果,不发送任何数据,转到步骤3;②如果,就发送二进制符号。这种比较一直进行到两个符号不相同为止,然后进入步骤3,14步骤3:加1,读下一个符号。假设第个输入符号为,按照以前的步骤把这个间隔分成如下