多媒体数据压缩实验报告_第1页
多媒体数据压缩实验报告_第2页
多媒体数据压缩实验报告_第3页
多媒体数据压缩实验报告_第4页
多媒体数据压缩实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多媒体数据压缩实验报告篇一:多媒体实验报告_文献压缩

课程设计报告

实验题目:文献压缩程序

姓名:指导教师:学院:计算机学院专业:计算机科学与技术学号:

提交报告时间:月日

四川大学

一,需求分析:

有两种形式的重复存在于计算机数据中,文献压缩程序就是对这两种重复进行了压

缩。

一种是短语形式的重复,即三个字节以上的重复,对于这种重复,压缩程序用两个数字:1.重复位置距现在压缩位置的距离;2.重复的长度,来表达这个重复,假设这两个数字各占一种字节,于是数据便得到了压缩。

第二种重复为单字节的重复,一种字节只有256种可能的取值,因此这种重复是必然的。给256种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编码,这样一来,变短的字节相对于变长的字节更多,文献的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越大。

编码式压缩必须在短语式压缩之后进行,由于编码式压缩后,原先八位二进制值的字节就被破坏了,这样文献中短语式重复的倾向也会被破坏(除非先进行解码)。另外,短语式压缩后的成果:那些剩余的未被匹配的单、双字节和得到匹配的距离、长度值仍然含有取值分布不均匀性,因此,两种压缩方式的次序不能变。

本程序设计只做了编码式压缩,采用Huffman编码进行压缩和解压缩。Huffman编码是一种可变长编码方式,是二叉树的一种特殊转化形式。编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的能够使用较长的编码,并且保持编码的唯一可解性。根据ascii码文献中各ascii字符出现的频率状况创立Huffman树,再将各字符对应的哈夫曼编码写入文献中。同时,亦可根据对应的哈夫曼树,将哈夫曼编码文献解压成字符文献.

一、概要设计:

压缩过程的实现:

压缩过程的流程是清晰而简朴的:1.创立Huffman树2.打开需压缩文献

3.将需压缩文献中的每个ascii码对应的huffman编码按bit单位输出生成压缩文献压缩结束。

其中,环节1和环节3是压缩过程的核心。

?环节1:这里所要做工作是得到Huffman数中各叶子结点字符出现的频率并进行创立.统计字符出现的频率能够有诸多办法:如每次创立前扫描被创立的文献,“实时”的生成各字符的出现频率;或者是创立前即做好统计.这里采用的是前一种办法。

?环节3:将需压缩文献中的每个ascii码对应的huffman编码按bit单位输出.这是本压缩程序中最核心的部分:这里涉及“转换”和“输出”两个核心环节:“转换”部分大可不必去通过遍历Huffman树来找到每个字符对应的哈夫曼编码,能够将每个Huffman码值及其对应的ascii码寄存于以下所示的结构体中:

解压缩过程的实现:

如果说,压缩的过程能够通过查找codeList来加速实现的话,而解压缩则必须通过查找huffman树才干加以实现.查找的过程是简朴的,能够根据

huffman树的性质来做,当haffCode的现在bit位为0时,则向左枝展开搜索;现在bit位为1时,则向右枝展开搜索,当碰到叶子结点时,则输出haffCode对应的asciiCode。

二、具体设计:

核心算法源程序:

Huffman树建立源程序:

//-------------------------------------------------------------//huffmantree.h//霍夫曼树

#ifndefHUFFMANTREE#defineHUFFMANTREE

#defineDefaultsize300

#include#include"bintree.h"#include"heap.h"

classCode{

public:

intcode;Code*link;

Code(intc=0,Code*l=NULL):code(c),link(l){};};

classCharNameNode{

public:

unsignedcharcharname;//要这样才行Code*link;

CharNameNode(unsignedcharc=0,Code*l=NULL):charname(c),link(l){};};

template

classHuffmanTree:publicBinaryTree{

public:

intkey;

HuffmanTree(){};

HuffmanTree(HuffmanTree&ht1,HuffmanTree&ht2){

Typetemp=0;//可能有变key=ht1.key+ht2.key;

root=newBinTreeNode(0,Copy(ht1.root),Copy(ht2.root));}

voidBuild(int*fr,Type*value,intn,HuffmanTree&newtree);

voidPath(BinTreeNode*start,Code*first,Code*last,CharNameNode*Node,int&i);//一种数组};

template

voidHuffmanTree::Build(int*fr,Type*value,intn,HuffmanTree&newtree)

{//fr为value(值)对应的权

inti;

HuffmanTreefirst,second;

HuffmanTreeNode[Defaultsize];MinHeap>hp;assert(n>=0&&nNode[i].root=newBinTreeNode(value[i],NULL,NULL);Node[i].key=fr[i];}

hp=MinHeap>(Node,n);for(i=0;ihp.RemoveMin(first);hp.RemoveMin(second);

HuffmanTree*temp=newHuffmanTree(first,second);hp.Insert(*temp);}

hp.RemoveMin(newtree);}

template

voidHuffmanTree::Path(BinTreeNode*start,Code*first,Code*last,CharNameNode*Node,int&i)//一种数组{

if(start==NULL)return;

//if(start->GetData()!=0)//是叶结点严重错误,可能叶结点也是0!!if(start->GetLeft()==NULL&&start->GetRight()==NULL){

Node[i].charname=start->GetData();Node[i].link=NULL;if(first==NULL)return;

Node[i].link=newCode(first->code);Code*p=first->link,*q=Node[i].link;while(p!=NULL){

q->link=newCode(p->code);q=q->link;p=p->link;}

q->link=NULL;i++;return;}

Code*temp=newCode;//进入左子树assert(temp);if(first==NULL)

first=last=temp;else{

last->link=temp;last=last->link;}

Path(start->GetLeft(),first,last,Node,i);

last->code=1;

Path(start->GetRight(),first,last,Node,i);temp=first;

if(first==last){

deletelast;

first=last=NULL;return;}

while(temp->link!=last)temp=temp->link;

temp->link=NULL;deletelast;last=temp;}

#endif

实现二叉树的算法源程序:

//---------------------------------------------------------------------//bintree.h

//用指针实现的二叉树

//Type类型必须有重载>及=运算

#ifndefBINTREE#defineBINTREE

#include#include

intMax(inta,intb){

returna>b?a:b;}

templateclassBinaryTree;

template

e>classBinTreeNode{

friendclassBinaryTree;public:

BinTreeNode():leftchild(NULL),rightchild(NULL){};

BinTreeNode(Typeitem,BinTreeNode*left=NULL,BinTreeNode*right=NULL)

:data(item),leftchild(left),rightchild(right){};TypeGetData()const{returndata;}

BinTreeNode*GetLeft()const{returnleftchild;}BinTreeNode*GetRight()const{returnrightchild;}voidSetData(constType&item){data=item;}

voidSetLeft(BinTreeNode*L){leftchild=L;}voidSetRight(BinTreeNode*R){rightchild=R;}private:

BinTreeNode*leftchild,*rightchild;Typedata;

篇二:多媒体实验报告二图片的压缩解决

计算机科学与技术学院

XX-XX年第1学期

《多媒体技术》

实验二:图像压缩算法实现

专业:

学号:

姓名:

教师:

完毕日期:

多媒体技术实验二实验报告

(一)实验目的

1.理解有损压缩和无损压缩的概念;

2.理解图像压缩的重要原则和目的;

3.理解几个惯用的图像压缩编码方式;

4.运用MATLAB程序进行图像压缩;

(二)实验环境

1.高档微机:MPC

2.课前准备:原则实验纸张若干张

3.操作系统:WindowsXX或WindowsXP中文版

4.编程工具:Matlab7.0

(三)实验过程及成果

实验原理:

1.图像压缩原理

图像压缩重要目的是为了节省存储空间,增加传输速度。图像压缩的抱负原则是信息丢失最少,压缩比例最大。不损失图像质量的压缩称为无损压缩,无损压缩不可能达成很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。压缩的实现办法是对图像重新进行编码,但愿用更少的数据表达图像。信息的冗余量有许多个,如空间冗余,时间冗余,构造冗余,知识冗余,视觉冗余等,数据压缩实质上是减少这些冗余量。高效编码的重要办法是尽量去除图像中的冗余成分,从而以最小的码元包含最大的图像信息。编码压缩办法有许多个,从不同的角度出发有不同的分类办法,从信息论角度出发可分为两大类。

(1).冗余度压缩办法,也称无损压缩、信息保持编码或嫡编码。具体说就是解码图像和压缩编码前的图像严格相似,没有失真,从数学上讲是一种可逆运算。

(2)信息量压缩办法,也称有损压缩、失真度编码或烟压缩编码。也就是说解码图像和原始图像是有差别的,允许有一定的失真。

应用在多媒体中的图像压缩编码办法,从压缩编码算法原理上能够分为下列3类:

(1)无损压缩编码种类

哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempelzev编码。

(2)有损压缩编码种类

预测编码,DPCM,运动赔偿;

频率域办法:正交变换编码(如DCT),子带编码;

空间域办法:统计分块编码;

模型办法:分形编码,模型基编码;

基于重要性:滤波,子采样,比特分派,向量量化;

(3)混合编码。

有JBIG,H261,JPEG,MPEG等技术原则。

本实验重要运用MATLAB程序进行离散余弦变换(DCT)压缩和行程编码(RunLengthEncoding,RLE)。

2.图像压缩的办法:

1.有损压缩:(离散余弦变换(DCT)图像压缩原理)

压缩原理介绍:离散余弦变换DCT在图像压缩中含有广泛的应用。

和相似图像质量的其它惯用文献格式(如GIF(可交换的图像文献格式),TIFF(标签图像文献格式),PCX(图形文献格式))相比,JPEG是现在静态图像中压缩比最高的。JPEG比其它几个压缩比要高得多,而图像质量都差不多(JPEG解决的图像只有真彩图和灰度图)。正是由于其高压缩比,使得JPEG被广泛地应用于多媒体和网络程序中。JPEG有几个模式,其中最惯用的是基于DCT变换的次序型模式,又称为基本系统(Baseline)。

用DCT压缩图像的过程为:

(1)首先将输入图像分解为8×8或16×16的块,然后对每个子块进行二维DCT变换。

(2)将变换后得到的量化的DCT系数进行编码和传送,形成压缩后的图像格

式。

用DCT解压的过程为:

(1)对每个8×8或16×16块进行二维DCT反变换。

(2)将反变换的矩阵的块合成一种单一的图像。

余弦变换含有把高度有关数据能量集中的趋势,DCT变换后矩阵的能量集中在矩阵的左上角,右下的大多数的DCT系数值非常靠近于0。对于普通的图像来说,舍弃这些靠近于0的DCT的系数值,并不会对重构图像的画面质量带来明显的下降。因此,运用DCT变换进行图像压缩能够节省大量的存储空间。压缩应当在最合理地近似原图像的状况下使用最少的系数。使用系数的多少也决定了压缩比的大小。在压缩过程的第2步中,能够合理地舍弃某些系数,从而得到压缩的目的。在压缩过程的第2步,还能够采用RLE和Huffman编码来进一步压缩。

离散余弦(DCT)压缩代码:

1)运用DCT变换进行图像压缩的MATLAB程序:

RGB=imread('1.JPG');

I=rgb2gray(RGB);

J=dct2(I);

imshow(log(abs(J),[]),colormap(jet(64)),colorbar

J(abs(J)K=idct2(J);

figure,imshow(I);

figure,imshow(K,[0,255]);

2)运用离散余弦变换进行JPEG图像压缩:

RGB=imread('1.JPG');

I=rgb2gray(RGB);

J=dct2(I);

imshow(log(abs(J),[]),colormap(jet(64)),colorbar

J(abs(J)K=idct2(J);

figure,imshow(I);

figure,imshow(K,[0,255]);

2)

I=imread('1.JPG');

I=rgb2gray(I);

I=im2double(I);

T=dctmtx(8);

B=blkproc(I,[88],'P1*x*P2',T,T');

mask=[11110000

11100000

11000000

10000000

00000000

00000000

00000000

00000000];

B2=blkproc(B,[88],'P1.*x',mask);

I2=blkproc(B2,[88],'P1*x*P2',T',T);

Subplot(1,2,1);

Imshow(I);title('原图像');

Subplot(1,2,2);

Imshow(I2);title('压缩图像');

截图:原图像与压缩图像

2.无损压缩:(运用行程编码(RLE)进行图像压缩原理)

压缩原理介绍:

RLE(Run-LengthEncoding行程长度编码)算法是Windows系统中使用的一种图像文献压缩办法,其基本思想是:将一扫描行中颜色值相似的相邻像素用两个字节来表达,第一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论