数据压缩实验指导书 下载本文

内容发布更新时间 : 2024/7/1 17:48:46星期一 下面是文章的全部内容请认真阅读。

目 录

实验一 用C/C++语言实现游程编码 ...................................... 2

实验二 实验三 实验四 用C/C++语言实现算术编码 ...................................... 5

用C/C++语言实现LZW编码.................................. 12

用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编码方

2

法不适用于自然图像的压缩,相反,在自然图像的压缩中还真少不了RLE,只不过是不能单纯使用RLE一种编码方法,需要和其他的压缩编码技术联合应用。

4、思考题:

①如果是英文字符,应该从哪几方面去进行考虑? ②是否所有的字符都要RLE编码方法来进行编码? ③如何区分字符与重复因子?

#include using namespace std; class Youchen {

public:

void shuru_xulie(); void bianma_xulie(); private:

char array[1000]; int m; };

void Youchen::shuru_xulie()//输入序列 {

int i;m=0;

cout<<\请输入序列(以.结束!):\ for(i=0;;i++) {

cin>>array[i]; m+=1;

if(array[i]=='.') break; } }

void Youchen::bianma_xulie()//用游程编码方法进行编码 {

int i,j,sum=0;

cout<<\编码后序列:\ for(i=0;i<=m-1;i++) {

if(array[i]==array[i+1])//对相同字符进行记数 sum++;

else//如果前后两字符不相等则进行输出

3