数据压缩实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目 录
实验一用C/C++语言实现游程编码
实验二用C/C++语言实现算术编码
实验三用C/C++语言实现LZW编码
实验四用C/C++语言实现2D-DCT变换13
实验一用C/C++语言实现游程编码
1. 实验目的
1) 通过实验进一步掌握游程编码的原理;
2) 用C/C++语言实现游程编码。
2. 实验要求
给出数字字符,能正确输出编码。
3. 实验内容
现实中有许多这样的图像,在一幅图像中具有许多颜色相同的图块。在这些图块中,许多行上都具有相同的颜色,或者在一行上有许多连续的象素都具有相同的颜色值。在这种情况下就不需要存储每一个象素的颜色值,而仅仅存储一个象素的颜色值,以及具有相同颜色的象素数目就可以,或者存储一个象素的颜色值,以及具有相同颜色值的行数。这种压缩编码称为游程编码,常用(run length encoding,RLE)表示,具有相同颜色并且是连续的象素数目称为游程长度。
为了叙述方便,假定一幅灰度图像,第n行的象素值为:
用RLE编码方法得到的代码为:0@81@38@501@40@8。代码中用黑体表示的数字是游程长度,黑体字后面的数字代表象素的颜色值。例如黑体字50代表有连续50个象素具有相同的颜色值,它的颜色值是8。
对比RLE编码前后的代码数可以发现,在编码前要用73个代码表示这一行的数据,而编码后只要用11个代码表示代表原来的73个代码,压缩前后的数据量之比约为7:1,即压缩比为7:1。这说明RLE确实是一种压缩技术,而且这种编码技术相当直观,也非常经济。RLE所能获得的压缩比有多大,这主要是取决于图像本身的特点。如果图像中具有相同颜色的图像块越大,图像块数目越少,获得的压缩比就越高。反之,压缩比就越小。
译码时按照与编码时采用的相同规则进行,还原后得到的数据与压缩前的数据完全相同。因此,RLE是无损压缩技术。
RLE压缩编码尤其适用于计算机生成的图像,对减少图像文件的存储空间非常有效。然而,RLE对颜色丰富的自然图像就显得力不从心,在同一行上具有相同颜色的连续象素往往很少,而连续几行都具有相同颜色值的连续行数就更少。如果仍然使用RLE编码方法,不仅不能压缩图像数据,反而可能使原来的图像数据变得更大。请注意,这并不是说RLE编码方法不适用于自然图像的压缩,相反,在自然图像的压缩中还真少不了RLE,只不过是不能单纯使用RLE一种编码方法,需要和其他的压缩编码技术联合应用。
4、思考题:
①如果是英文字符,应该从哪几方面去进行考虑?
②是否所有的字符都要RLE编码方法来进行编码?
③如何区分字符与重复因子?
实验二用C/C++语言实现算术编码
1. 实验目的
1) 通过实验进一步掌握算术编码的原理;
2) 用C/C++语言实现算术编、解码。
2. 实验要求
1) 能正确进行码字刷新及区间刷新;
2) 合理输出码字;
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中。
编码时首先输入的符号是10,找到它的编码范围是[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所示。
图1 算术编码过程举例
这个例子的编码和译码的全过程分别表示在表4-05和表4-06中。根据上面所举的例子,可把计算过程总结如下。
考虑一个有M个符号
的字符表集,假设概率
,而
。输入符号用
表示,第
个子间隔的范围用
表示。其中
,
和
,
表示间隔左边界的值,
表示间隔右边界的值,
表示间隔长度。编码步骤如下:
步骤1:首先在1和0之间给每个符号分配一个初始子间隔,子间隔的长度等于它的概率,初始子间隔的范围用
[
,
)表示。令
,
和
。
步骤2:L和R的二进制表达式分别表示为:
和
其中
和
等于“1”或者“0”。
比较
和
:①如果
,不发送任何数据,转到步骤3;②如果
,就发送二进制符号
。
比较
和
:①如果
,不发送任何数据,转到步骤3;②如果
,就发送二进制符号
。这种比较一直进行到两个符号不相同为止,然后进入步骤3,步骤3:
加1,读下一个符号。假设第
个输入符号为
,按照以前的步骤把这个间隔分成如下所示的子间隔:
令
,
和
,然后转到步骤2。
假设有4个符号的信源,它们的概率如表4所示:
[过程2] 假设有4个符号的信源,它们的概率如表4所示:概率
。它的编码过程,现说明如下。
输入第
1
个符号是
,可知
,定义初始间隔
[
,
)=[0.5, 0.75),由此可知
,左右边界的二进制数分别表示为:L =0.5=0.1(B)
,R =0.7
=0.11… (B)。按照步骤2,
,发送1
。因,因此转到步骤3。
输入第2个字符
,
,它的子间隔