多媒体数据压缩实验报告
篇一:多媒体实验报告_文件压缩
课程设计报告
实验题目:文件压缩程序
姓 名: 指导教师:学 院: 计算机学院 专 业:计算机科学与技术学 号:
提交报告时间:20年 月 日
四川大学
一,需求分析:
有两种形式的重复存在于计算机数据中,文件压缩程序就是对这两种重复进行了压
缩。
一种是短语形式的重复,即三个字节以上的重复,对于这种重复,压缩程序用两个数字:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个字节,于是数据便得到了压缩。
第二种重复为单字节的重复,一个字节只有256种可能的取值,所以这种重复是必然的。给 256 种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编
课程设计报告
实验题目:文件压缩程序
姓 名: 指导教师:学 院: 计算机学院 专 业:计算机科学与技术学 号:
提交报告时间:20年 月 日
四川大学
一,需求分析:
有两种形式的重复存在于计算机数据中,文件压缩程序就是对这两种重复进行了压
缩。
一种是短语形式的重复,即三个字节以上的重复,对于这种重复,压缩程序用两个数字:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个字节,于是数据便得到了压缩。
第二种重复为单字节的重复,一个字节只有256种可能的取值,所以这种重复是必然的。给 256 种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编
码,这样一来,变短的字节相对于变长的字节更多,文件的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越大。
编码式压缩必须在短语式压缩之后进行,因为编码式压缩后,原先八位二进制值的字节就被破坏了,这样文件中短语式重复的倾向也会被破坏(除非先进行解码)。另外,短语式压缩后的结果:那些剩下的未被匹配的单、双字节和得到匹配的距离、长度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺序不能变。
本程序设计只做了编码式压缩,采用Huffman编码进行压缩和解压缩。Huffman编码是一种可变长编码方式,是二叉树的一种特殊转化形式。编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。根据 ascii 码文件中各 ascii 字符出现的频率情况创建 Huffman 树,再将各字符对应的哈夫曼编码写入文件中。同时,亦可根据对应的哈夫曼树,将哈夫曼编码文件解压成字符文件.
一、 概要设计:
压缩过程的实现:
压缩过程的流程是清晰而简单的: 1. 创建 Huffman 树 2. 打开需压缩文件
3. 将需压缩文件中的每个 ascii 码对应的 huffman 编码按 bit 单位输出生成压缩文件压缩结
编码式压缩必须在短语式压缩之后进行,因为编码式压缩后,原先八位二进制值的字节就被破坏了,这样文件中短语式重复的倾向也会被破坏(除非先进行解码)。另外,短语式压缩后的结果:那些剩下的未被匹配的单、双字节和得到匹配的距离、长度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺序不能变。
本程序设计只做了编码式压缩,采用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。
二、 详细设计:
其中,步骤 1和步骤 3是压缩过程的关键。
? 步骤1:这里所要做工作是得到 Huffman数中各叶子结点字符出现的频率并进行创建.统计字符出现的频率可以有很多方法:如每次创建前扫描被创建的文件,“实时”的生成各字符的出现频率;或者是创建前即做好统计.这里采用的是前一种方法。
? 步骤 3: 将需压缩文件中的每个 ascii 码对应的 huffman 编码按 bit 单位输出. 这是本压缩程序中最关键的部分: 这里涉及“转换”和“输出”两个关键步骤: “转换”部分大可不必去通过遍历 Huffman 树来到每个字符对应的哈夫曼编码,可以将每个 Huffman 码值及其对应的 ascii 码存放于如下所示的结 构体中:
解压缩过程的实现:
如果说,压缩的过程可以通过查 codeList 来加速实现的话,而解压缩则必须通过查 huffman 树才能加以实现.查的过程是简单的,可以根据
huffman 树的性质来做,当 haffCode的当前 bit 位为 0 时,则向左枝展开搜索;当前bit 位为1时,则向右枝展开搜索,当遇到叶子结点时,则输出haffCode对应的 asciiCode。
二、 详细设计:
核心算法源程序:
Huffman树建立源程序:
//------------------------------------------------------------- //huffmantree.h //霍夫曼树
#ifndef HUFFMANTREE #define HUFFMANTREE
#define Defaultsize 300
#include #include "bintree.h" #include "heap.h"
class Code {
public:
int code; Code *link;
Code(int c=0,Code *l=NULL):code(c),link(l){}; };
class CharNameNode {
public:
unsigned char charname; //要这样才行 Code *link;
CharNameNode(unsigned char c=0,Code *l=NULL):charname(c),link(l){}; };
template
Huffman树建立源程序:
//------------------------------------------------------------- //huffmantree.h //霍夫曼树
#ifndef HUFFMANTREE #define HUFFMANTREE
#define Defaultsize 300
#include #include "bintree.h" #include "heap.h"
class Code {
public:
int code; Code *link;
Code(int c=0,Code *l=NULL):code(c),link(l){}; };
class CharNameNode {
public:
unsigned char charname; //要这样才行 Code *link;
CharNameNode(unsigned char c=0,Code *l=NULL):charname(c),link(l){}; };
template
class HuffmanTree:public BinaryTree {
public:
int key;
HuffmanTree(){};
HuffmanTree(HuffmanTree &ht1,HuffmanTree &ht2) {
Type temp=0; //可能有变key=ht1.key+ht2.key;
root= new BinTreeNode(0,),)); }
void Build(int *fr,Type *value,int n,HuffmanTree &newtree);
void Path(BinTreeNode *start,Code *first,Code *last,CharNameNode *Node,int &i); //一个数组};
template
void HuffmanTree::Build(int *fr,Type *value,int n,HuffmanTree &newtree)
{//fr 为 value(值) 对应的权
int i;
HuffmanTree first,second;
public:
int key;
HuffmanTree(){};
HuffmanTree(HuffmanTree &ht1,HuffmanTree &ht2) {
Type temp=0; //可能有变key=ht1.key+ht2.key;
root= new BinTreeNode(0,),)); }
void Build(int *fr,Type *value,int n,HuffmanTree &newtree);
void Path(BinTreeNode *start,Code *first,Code *last,CharNameNode *Node,int &i); //一个数组};
template
void HuffmanTree::Build(int *fr,Type *value,int n,HuffmanTree &newtree)
{//fr 为 value(值) 对应的权
int i;
HuffmanTree first,second;
HuffmanTree Node[Defaultsize]; MinHeap > hp; assert(n>=0&&n Node[i].root=new BinTreeNode(value[i],NULL,NULL);Node[i].key=fr[i]; }
hp=MinHeap >(Node,n); for(i=0;i hp.RemoveMin(first);hp.RemoveMin(second);
HuffmanTree* temp=new HuffmanTree(first,second);hp.Insert(*temp); }
hp.RemoveMin(newtree); }
template
void HuffmanTree::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=new Code(first->code);Code *p=first->link,*q=Node[i].link;while(p!=NULL){
q->link=new Code(p->code); q=q->link; p=p->link;}
q->link=NULL;i++;return; }
hp=MinHeap >(Node,n); for(i=0;i hp.RemoveMin(first);hp.RemoveMin(second);
HuffmanTree* temp=new HuffmanTree(first,second);hp.Insert(*temp); }
hp.RemoveMin(newtree); }
template
void HuffmanTree::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=new Code(first->code);Code *p=first->link,*q=Node[i].link;while(p!=NULL){
q->link=new Code(p->code); q=q->link; p=p->link;}
q->link=NULL;i++;return; }
Code *temp=new Code; //进入左子树 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) {
delete last;
first=last=NULL;return; }
while(temp->link!=last)temp=temp->link;
temp->link=NULL; delete last; last=temp; }
#endif
实现二叉树的算法源程序:
//--------------------------------------------------------------------- //bintree.h
//用指针实现的二叉树
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) {
delete last;
first=last=NULL;return; }
while(temp->link!=last)temp=temp->link;
temp->link=NULL; delete last; last=temp; }
#endif
实现二叉树的算法源程序:
//--------------------------------------------------------------------- //bintree.h
//用指针实现的二叉树
//Type 类型必须有重载>及=运算
#ifndef BINTREE #define BINTREE
#include #include
int Max(int a,int b) {
return a>b?a:b; }
template class BinaryTree;
template
e> class BinTreeNode {
friend class BinaryTree; public:
BinTreeNode():leftchild(NULL),rightchild(NULL){};
BinTreeNode(Type item,BinTreeNode *left = NULL,BinTreeNode *right=NULL)
:data(item),leftchild(left),rightchild(right){}; Type GetData()const { return data; }
BinTreeNode *GetLeft()const { return leftchild; } BinTreeNode *GetRight()const { return rightchild; } void SetData(const Type &item){ data=item; }
void SetLeft(BinTreeNode *L){ leftchild = L; }void SetRight(BinTreeNode *R){ rightchild =
#ifndef BINTREE #define BINTREE
#include #include
int Max(int a,int b) {
return a>b?a:b; }
template class BinaryTree;
template
e> class BinTreeNode {
friend class BinaryTree; public:
BinTreeNode():leftchild(NULL),rightchild(NULL){};
BinTreeNode(Type item,BinTreeNode *left = NULL,BinTreeNode *right=NULL)
:data(item),leftchild(left),rightchild(right){}; Type GetData()const { return data; }
BinTreeNode *GetLeft()const { return leftchild; } BinTreeNode *GetRight()const { return rightchild; } void SetData(const Type &item){ data=item; }
void SetLeft(BinTreeNode *L){ leftchild = L; }void SetRight(BinTreeNode *R){ rightchild =
R; } private:
BinTreeNode *leftchild, *rightchild; Type data;
篇二:多媒体实验报告二图片的压缩处理
计算机科学与技术学院
XX-XX学年第1学期
《多媒体技术》
实验二:图像压缩算法实现
专业:
学号:
姓名:
教师:
完成日期:
多媒体技术实验二 实验报告
(一)实验目的
1.理解有损压缩和无损压缩的概念;
BinTreeNode *leftchild, *rightchild; Type data;
篇二:多媒体实验报告二图片的压缩处理
计算机科学与技术学院
XX-XX学年第1学期
《多媒体技术》
实验二:图像压缩算法实现
专业:
学号:
姓名:
教师:
完成日期:
多媒体技术实验二 实验报告
(一)实验目的
1.理解有损压缩和无损压缩的概念;
2.理解图像压缩的主要原则和目的;
3.了解几种常用的图像压缩编码方式;
4.利用MATLAB程序进行图像压缩;
(二)实验环境
1.高档微机:MPC
2.课前准备:标准实验纸张若干张
3.操作系统:Windows XX 或Windows XP 中文版
4.编程工具:Matlab7.0
(三)实验过程及结果
实验原理:
1.图像压缩原理
图像压缩主要目的是为了节省存储空间,增加传输速度。图像压缩的理想标准是信息丢失最少,压缩比例最大。不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。信息的冗余量有许多种,如
3.了解几种常用的图像压缩编码方式;
4.利用MATLAB程序进行图像压缩;
(二)实验环境
1.高档微机:MPC
2.课前准备:标准实验纸张若干张
3.操作系统:Windows XX 或Windows XP 中文版
4.编程工具:Matlab7.0
(三)实验过程及结果
实验原理:
1.图像压缩原理
图像压缩主要目的是为了节省存储空间,增加传输速度。图像压缩的理想标准是信息丢失最少,压缩比例最大。不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。信息的冗余量有许多种,如
空间冗余,时间冗余,结构冗余,知识冗余,视觉冗余等,数据压缩实质上是减少这些冗余量。高效编码的主要方法是尽可能去除图像中的冗余成分,从而以最小的码元包含最大的图像信息。编码压缩方法有许多种,从不同的角度出发有不同的分类方法,从信息论角度出发可分为两大类。
(1).冗余度压缩方法,也称无损压缩、信息保持编码或嫡编码。具体说就是解码图像和压缩编码前的图像严格相同,没有失真,从数学上讲是一种可逆运算。
(2)信息量压缩方法,也称有损压缩、失真度编码或烟压缩编码。也就是说解码图像和原始图像是有差别的,允许有一定的失真。
应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下3类:
(1)无损压缩编码种类
哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。
(2)有损压缩编码种类
预测编码,DPCM,运动补偿;
频率域方法:正交变换编码(如DCT),子带编码;
字符串长度压缩 空间域方法:统计分块编码;
(1).冗余度压缩方法,也称无损压缩、信息保持编码或嫡编码。具体说就是解码图像和压缩编码前的图像严格相同,没有失真,从数学上讲是一种可逆运算。
(2)信息量压缩方法,也称有损压缩、失真度编码或烟压缩编码。也就是说解码图像和原始图像是有差别的,允许有一定的失真。
应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下3类:
(1)无损压缩编码种类
哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。
(2)有损压缩编码种类
预测编码,DPCM,运动补偿;
频率域方法:正交变换编码(如DCT),子带编码;
字符串长度压缩 空间域方法:统计分块编码;
模型方法:分形编码,模型基编码;
基于重要性:滤波,子采样,比特分配,向量量化;
(3)混合编码。
有JBIG,H261,JPEG,MPEG等技术标准。
本实验主要利用MATLAB程序进行离散余弦变换(DCT)压缩和行程编码(Run Length Encoding, RLE)。
2.图像压缩的方法:
1.有损压缩:(离散余弦变换(DCT)图像压缩原理)
压缩原理介绍:离散余弦变换DCT在图像压缩中具有广泛的应用。
和相同图像质量的其他常用文件格式(如GIF(可交换的图像文件格式),TIFF(标签图像文件格式),PCX(图形文件格式))相比,JPEG是目前静态图像中压缩比最高的。JPEG比其他几种压缩比要高得多,而图像质量都差不多(JPEG处理的图像只有真彩图和灰度图)。正是由于其高压缩比,使得JPEG被广泛地应用于多媒体和网络程序中。JPEG有几种模式,其中最常用的是基于DCT变换的顺序型模式,又称为基本系统(Baseline)。
用DCT压缩图像的过程为:
基于重要性:滤波,子采样,比特分配,向量量化;
(3)混合编码。
有JBIG,H261,JPEG,MPEG等技术标准。
本实验主要利用MATLAB程序进行离散余弦变换(DCT)压缩和行程编码(Run Length Encoding, 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程序:
(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]);
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,[8 8],'P1*x*P2',T,T');
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
I=imread('1.JPG');
I=rgb2gray(I);
I=im2double(I);
T=dctmtx(8);
B=blkproc(I,[8 8],'P1*x*P2',T,T');
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
Subplot(1,2,1);
Imshow(I);title('原图像');
Subplot(1,2,2);
Imshow(I2);title('压缩图像');
截图:原图像与压缩图像
2.无损压缩:(利用行程编码(RLE)进行图像压缩原理)
压缩原理介绍:
RLE(Run- Length Encoding 行程长度编码)算法是Windows 系统中使用的一种图像文件压缩方法, 其基本思想是: 将一扫描行中颜值相同的相邻像素用两个字节来表示, 第一个字节是一个计数值, 用于指定像素重复的次数; 第二个字节是具体像素的值[2]。主要通过压缩除掉数据中的冗余字节或字节中的冗余位,从而达到减少文件所占空间的目的。
例如, 有一表示颜像素值的字符串RRRRRGGBBBBBB,用 RLE 压缩方法压缩后可用 5R2G6B 来代替,显然后者的串长度比前者的串长度小得多。译码时按照与编码时采用的相同规则进行, 还原后得到的数据与压缩前的数据完全相同。因此, RLE 是无损压缩技术。对于拥
Subplot(1,2,1);
Imshow(I);title('原图像');
Subplot(1,2,2);
Imshow(I2);title('压缩图像');
截图:原图像与压缩图像
2.无损压缩:(利用行程编码(RLE)进行图像压缩原理)
压缩原理介绍:
RLE(Run- Length Encoding 行程长度编码)算法是Windows 系统中使用的一种图像文件压缩方法, 其基本思想是: 将一扫描行中颜值相同的相邻像素用两个字节来表示, 第一个字节是一个计数值, 用于指定像素重复的次数; 第二个字节是具体像素的值[2]。主要通过压缩除掉数据中的冗余字节或字节中的冗余位,从而达到减少文件所占空间的目的。
例如, 有一表示颜像素值的字符串RRRRRGGBBBBBB,用 RLE 压缩方法压缩后可用 5R2G6B 来代替,显然后者的串长度比前者的串长度小得多。译码时按照与编码时采用的相同规则进行, 还原后得到的数据与压缩前的数据完全相同。因此, RLE 是无损压缩技术。对于拥
有大面积,相同颜区域的图像,用RLE压缩方法非常有效。 例如如下这幅的二值图像,
如果采用行程编码可以按如下格式保存
篇三:试验 5 多媒体数据压缩实践 实验报告
实验五:多媒体数据压缩实践
学号:XX77XX8_______ 姓名:李丽________ 班级:_一班__
1. 实验目的:
1) 认识和了解数据压缩的基本原理。了解不同文件格式的数据量差异。
2) 掌握基本的数据格式转换与压缩方法。
2. 实验内容
1) 转换图像文件格式
试验如图:
打开素材文件
转换图片为JPEG格式
JPEG选项设置
图片转换目标文件夹设置
如果采用行程编码可以按如下格式保存
篇三:试验 5 多媒体数据压缩实践 实验报告
实验五:多媒体数据压缩实践
学号:XX77XX8_______ 姓名:李丽________ 班级:_一班__
1. 实验目的:
1) 认识和了解数据压缩的基本原理。了解不同文件格式的数据量差异。
2) 掌握基本的数据格式转换与压缩方法。
2. 实验内容
1) 转换图像文件格式
试验如图:
打开素材文件
转换图片为JPEG格式
JPEG选项设置
图片转换目标文件夹设置
、
转换为BMP文件
转换为GIF文件
转换后的文件
2) 观察数据量
a) 查看选项中个图片的详细资料
TIF文件:
JPG文件:
BMP文件:
GIF文件:
b) 观察可知,各个图片的数据量大小不同,TIF与BMP文件的数据量相同,最大,jpg文
件其次,gif文件数据量最小。
3. 思考题
1) 四种文件格式的颜数量一样吗?
答:BMP与TIF格式的文件颜数量相同,均为24位颜,jpg文件为24位颜,但数据为
转换为BMP文件
转换为GIF文件
转换后的文件
2) 观察数据量
a) 查看选项中个图片的详细资料
TIF文件:
JPG文件:
BMP文件:
GIF文件:
b) 观察可知,各个图片的数据量大小不同,TIF与BMP文件的数据量相同,最大,jpg文
件其次,gif文件数据量最小。
3. 思考题
1) 四种文件格式的颜数量一样吗?
答:BMP与TIF格式的文件颜数量相同,均为24位颜,jpg文件为24位颜,但数据为
有损压缩,gif文件为8位颜。
2) 分析文件数据量产生差异的原因。
2) 分析文件数据量产生差异的原因。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论