多媒体技术与应用由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“多媒体技术与应用答案”。
多媒体技术与应用
论文题目:图像压缩编码班
级:姓
名:学
号:
2010-12-09
摘要:
多媒体信息中视频、音频的数据量非常大,数据的传输、提高处理速度和节约存储空间成为多媒体的重点课题。因此数据压缩成了多媒体技术的关键技术之一。图象和视频通常在计算机中表示后会占用非常大的空间,而出于节省硬盘空间的考虑,往往要进行压缩。同时,传输过程中,为了节省珍贵的带宽资源和节省时间,也迫切要求压缩。压缩之后,传输过程中的误码率也会相应地减少
关键字:图像、压缩、编码
正文:
1、图像压缩编码技术概述
图像的数据量非常大。为了有效地传输和存储图像,有必要压缩图像的数据量。随着现代通信技术的发展,要求传输的图像信息的种类和数据量愈来愈大。若不对此进行数据压缩,便难以推广应用。
图像数据可以进行压缩有几方面的原因。首先,原始图像数据是高度相关的,存在很大的冗余。数据冗余造成比特数浪费,消除这些冗余可以节约码字,也就是达到了数据压缩的目的。大多数图像内相邻像素之间有较大的相关性,这称为空间冗余。序列图像前后帧内相邻之间有较大的相关性,这称为时间冗余。其次,若用相同码长来表示不同出现概率的符号也会造成比特数的浪费,这种浪费称为符号编码冗余。如果采用可变长编码技术,对出现概率高的符号用短码字表示,对出现概率低的符号用长码字表示,这样就可大大消除符号编码冗余。再次,有些图像信息(如色度信息、高频信息)在通常的视感觉过程中与另外一些信息相比来说不那么重要,这些信息可以认为是心里视觉冗余,去除这些信息并不会明显地降低人眼所感受到的图像质量,因此在压缩的过程中可以去除这些人眼不敏感的信息,从而实现数据压缩。
在满足一定保真度的要求下,对图像数据的进行变换、编码和压缩,去除多余数据减少表示数字图像时需要的数据量,以便于图像的存储和传输。即以较少的数据量有损或无损地表示原来的像素矩阵的技术,也称图像编码。图像压缩编码可分为两类:一类压缩是可逆的 ,即从压缩后的数据可以完全恢复原来的图像 ,信息没有损失 ,称为无损压缩编码;另一类压缩是不可逆的 ,即从压缩后的数据无法完全恢复原来的图像 ,信息有一定损失 ,称为有损压缩编码。
2、常用图像压缩编码算法简介
图像压缩编码技术从不同的角度出发,有不同的分类方法。根据压缩过程有无信息损失,可分为有损编码和无损编码。根据压缩原理进行划分,可以分为预测编码、变换编码、统计编码等。
有损编码:有损编码又称为不可逆编码,是指对图像进行有损压缩,致使解码重新构造的图像与原始图像存在一定的失真,即丢失了了部分信息。由于允许一定的失真,这类方法能够达到较高的压缩比。有损压缩多用于数字电视、静止图像通信等领域 无损编码:无损压缩又称可逆编码,是指解压后的还原图像与原始图像完全相同,没有任何信息的损失。这类方法能够获得较高的图像质量,但所能达到的压缩比不高,常用于工业检测、医学图像、存档图像等领域的图像压缩中。
预测编码:预测编码是利用图像信号在局部空间和时间范围内的高度相关性,以已经传出的近邻像素值作为参考,预测当前像素值,然后量化、编码预测误差。预测编码广泛应用于运动图像、视频编码如数字电视、视频电话中。
变换编码:变换编码是将空域中描述的图像数据经过某种正交变换(如离散傅里叶变换DFT、离散余弦变换DCT、离散小波变换DWT等)转换到另一个变换域(频率域)中进行描述,变换后的结果是一批变换系数,然后对这些变换系数进行编码处理,从而达到压缩图像数据的目的。
统计编码:统计编码也称为熵编码,它是一类根据信息熵原理进行的信息保持型变字长编码。编码时对出现概率高的事件(被编码的符号)用短码表示,对出现概率低的事件用长码表示。在目前图像编码国际标准中,常见的熵编码方法有哈夫曼(Huffman)编码和算术编码。
3、本文实现的图像压缩编码介绍
本文运用DCT变换编码算法进行图像。
说明:以上给出的是单个彩色分量的编码、解码过程,对于彩色图像,可将多个分量分别处理 编码步骤: DCT变换
JPEG采用8X8像素的二维DCT变换,在编码器输入端把原始图像顺序分割成8X8的子块。如原始图像的采样精度为P位,是无符号整数,则将[0,2P-1]转换为[-2P-1,2P-1]的有符号整数,作为CT的输入。
解码时,经DCT逆变换后得到8X8的图像数据块,在将[-2P-1,2P-1]变回[0,2P-1],获得重构的图像
原始图像数据块经过DCT变换后,输出64个DCT变换系数,形成一个8X8矩阵,其中包含一个代表直流分量的DC系数(矩阵的左上角,代表此块的彩色分量的平均值)和63个代表交流分量的AC系数(代表该块的彩色分量的起伏变化的剧烈程度)
DCT逆变换通过这64个DCT变换系数重建这8X8图像,由于计算过程中的精度损失和量化,不可能完全恢复原始图像——有损压缩 量化:
为达到压缩数据的目的,对DCT变换系数F(u,v)进行量化处理。量化是造成图像质量下降的最主要原因。利用人的视觉特性,经过大量实验,获得了一下的量化表Q(u,v)。量化公式为
FQ(u,v)=Integer(Round(F(u,v)/Q(u,v))DCT系数的编码: DCT变化系数经过量化后,直流分量DC数值比大,而且相邻的两个8X8块的DC系数有很强的相关性,变化不大,因此采用DPCM对相邻两块的DC的差值Delta进行编码
Delta=DCi-DCi-1 DCT变换系数经过量化之后,有大量AC会变成0,采用游程编码进一步进行数据压缩。为增加编码效率,采用“Z”字形的次序来进行游程编码,可以增加连续0的个数。
4、程序实现过程中所遇压缩编码到的问题,及其解决方法
在程序实现过程中,遇到了一系列的压缩编码问题。发现在解压中出现大量异常,调试后发现输出字节中出现大量负数,分析知是读取文件字节类型时转换到整数时出错,将读到的char型强制转化为int时出错,故将其先转化为无符号char后再转为int后问题得到解决。遇到很多解压缩串码的问题,调试发现在压缩/解压缩多处有误,改正后程序运行正确。遇到程序解码时程序卡死情况,分析出出错位置后得到解决。遇到解压文件提前结束情况,分析得遇到1A结束,查询知:1A就是EOF。打开文件的时候指定为二进制方式后问题得到解决。
5、总结:
1、程序设计难点:
本程序的难点在于字典算法的实现及生成文件规则的制定。
2、程序设计中的不足:
本程序功能上实现了对文件的压缩,但是在物理、及时间复杂性上还有待优化。同时,还需将其进一步使用在网络通信上。
3、训练体会:
这次训练我最大的收获有两个:
其一、设计软件前一定要将核心的算法用伪代码写出来,这样会极大的避免一些在程序调试过程中的麻烦,可以省不少时间。
其二、调试软件时,遇到程序跑死情况,可以使用对程序分段标记来查找问题出处。此外,多写信息记录点也是一个良好的习惯。
参考文献:
1.高志坚主编.多媒体技术及其应用.同济大学出版社.2009年8月.2.朱学芳著.多媒体信息处理与检索技术.电子工业出版社.2002.11 3.曲建民主编.多媒体计算机技术.清华大学出版社.2005年4月.4.雷运发编著.多媒体技术与应用教程.清华大学出版社.2009年1月
附程序设计代码:
////////////////////////////////////////////////////////////////////// //函数名称: BmpToDCT //完成功能: 对位图文件进行压缩(用DCT变换压缩)//输入参数: 文件名 filename //输出参数: 压缩后数据的长度nTotal,压缩后数据指针lpDst //返回参数: 是否成功
////////////////////////////////////////////////////////////////////// int CDib::BmpToDCT(LPCSTR filename,LONG &nTotal,char *lpDst){ //量化参数
static BYTE Q_table[64] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};//用数组实现获取图像数据
int nWidth,nHeight,i,j,k,i_start,j_start;BYTE Gray[GraySize][GraySize];LoadBmp(filename);Read_Imagedata(nWidth,nHeight,Gray);//将图像数据分成若干个8×8的子块,获取子块数据,共4096个子分块
BYTE FkGray[4096][8][8];DWORD dwBuffUsed=0;// 缓冲区已使用的字节数
// 中间变量
char bChar1;char bChar2;// 重复像素计数
BYTE iCount=0;//lpDst = new BYTE[nWidth*nHeight];for(k=0;k
i_start =(k/64)*8;//整数商×8
for(i=0;i
{
j_start =(k%64)*8;//整余数×8
for(j=0;j
{
FkGray[k][i][j]=Gray[i_start][j_start];
j_start++;
}
i_start++;
} } // double *f = new double[64];//存放DCT系数缓冲区
char *f1 = new char[64];//量化后的系数
char *temp_f1;int m;for(k=0;k
m=0;
for(i=0;i
{
for(j=0;j
{
f[m]=(double)FkGray[k][i][j];
m++;
}
}
fdct_2D(f,3,3);//二维DCT变换
for(i=0;i
f1[i]=(char)((f[i]/Q_table[i]));
//对子分块进行游程编码 temp_f1 = f1;
bChar1 = *temp_f1;// 给bChar1赋值
iCount = 1;// 设置iCount为1
temp_f1++;// 读取下一个像素
bChar2 = *temp_f1;
for(i =0;i
{
if(bChar1 == bChar2)// 判断是否和bChar1相同
{
iCount ++;// 相同,计数加1,继续读下一个
temp_f1++;
bChar2 = *temp_f1;
}
else
{ // 不同,写入缓冲区
if(iCount > 1)
{
lpDst[dwBuffUsed] = iCount;// 保存码长信息
}
else
{
lpDst[dwBuffUsed] = 1;// 保存码长信息
}
lpDst[dwBuffUsed + 1] = bChar1;// 保存bChar1
dwBuffUsed += 2;// 更新dwBuffUsed
bChar1 = bChar2;// 重新给bChar1赋值
temp_f1++;// 重新给bChar2赋值
bChar2 = *temp_f1;
iCount = 1;
}
}
}
nTotal = dwBuffUsed;//返回编码后的图像字节数
return 1;
}
////////////////////////////////////////////////////////////////////// //函数名称: DCTToBmp //完成功能: 对DCT文件进行解压缩 //输入参数: 文件名 filename //输出参数: 解压缩后数据的长度nTotal,解压缩后数据指针lpDst //返回参数: 是否成功
////////////////////////////////////////////////////////////////////// int CDib::DCTToBmp(LPCSTR filename,LONG &nTotal,BYTE *lpDst){ //量化参数 static BYTE Q_table[64] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};
//定义DCT文件的指针
CFile file;char *lpDCTfile = new char[512*512];DWORD DCTDataSize;//打开文件
if(!file.Open(filename,CFile::modeRead|CFile::shareDenyNone)){
AfxMeageBox(“Can not open the file!”);
return-1;} DCTDataSize = file.GetLength();//获取文件的长度
file.Read(lpDCTfile,DCTDataSize);//读文件
lpDCTfile=lpDCTfile+14+40+256*4;//将文件指针移到DCT数据区域
BYTE Gray[GraySize][GraySize];//存放BMP数据
char FkGray[4096][8][8];//存放8*8子块数据 int i,j,k,i_start,j_start;char bchar1,bchar2;char *lptemp = new char[512*512];i=0;int ff;//test while(i
{
bchar1=*lpDCTfile;
lpDCTfile++;
bchar2=*lpDCTfile;
lpDCTfile++;
while(bchar1!=0)
{
lptemp[i] = bchar2;
i++;
bchar1--;
}
if(i>252550)ff++;} //将数据放到各个子块
for(k=0;k
for(i=0;i
for(j=0;j
{
FkGray[k][i][j] = *lptemp;
lptemp++;
} } // double *f1 = new double[64];//还原量化前的系数(即DCT系数)
//int *f = new int[64];//存放DCT系数反变换后的数据缓冲区
int m;for(k=0;k
m=0;
for(i=0;i
{
for(j=0;j
{
f1[m]=(double)(FkGray[k][i][j]*Q_table[m]);
m++;
}
}
fidct_2D(f1,3,3);//二维DCT反变换
m=0;
i_start =(k/64)*8;//整数商×8
for(i=0;i
{
j_start =(k%64)*8;//整余数×8
for(j=0;j
{
Gray[i_start][j_start]=(BYTE)(f1[m]);
m++;
j_start++;
}
i_start++;
} } // for(i=511;i>0;i--)
for(j=0;j
{
*lpDst=Gray[i][j];
lpDst++;
} ///////////////////////////////////////////////////////////////////////////////
nTotal = 512*512;//返回编码后的图像字节数
return 1;
}
/////////////////////////////////////// //BOOL BMPToMyPcx(BYTE *lpDIBBits,LONG lSrcBytes,BYTE *lpDst,LONG lDstBytes)//完成功能:将原BMP图像数据通过游程编码进行压缩
//输入参数:位图源图像象素的指针lpDIBBits,原图像数据长度lSrcBytes // 压缩后图像象素的指针lpDst,压缩后数据长度lDstBytes //返回参数:是否成功
/////////////////////////////////////// BOOL CDib::BMPToMyPcx(BYTE *lpDIBBits,LONG lSrcBytes,BYTE *lpDst,LONG &lpDstBytes){
// 循环变量
LONG i;LONG j;
// DIB高度
WORD wHeight = 512;
// DIB宽度
WORD wWidth = 512;
// 中间变量
BYTE bChar1;BYTE bChar2;
// 图像每行的字节数
LONG lLineBytes = wWidth * 3;// 重复像素计数
int iCount;
// 缓冲区已使用的字节数
DWORD dwBuffUsed;
// BYTE *lpSrc;
//******************************************************************************* // 开始编码
// 开辟一片缓冲区(2被原始图像大小)以保存编码结果
lpDst = new BYTE[wHeight * wWidth * 2];
// 指明当前已经用了多少缓冲区(字节数)
dwBuffUsed = 0;
// 每行
for(i = 0;i
// 指向DIB第i行,第0个象素的指针
lpSrc = lpDIBBits + lLineBytes *(wHeighti);
// 给bChar1赋值
bChar1 = *lpSrc;
// 设置iCount为1
iCount = 1;
// 剩余列
for(j = 1;j
{
// 指向DIB第i行,第j个象素的指针
lpSrc++;
// 读取下一个像素
bChar2 = *lpSrc;
// 判断是否和bChar1相同并且iCount
if((bChar1 == bChar2)&&(iCount
{
// 相同,计数加1
iCount ++;
// 继续读下一个
} else {
// 不同,或者iCount = 63
// 写入缓冲区
if((iCount > 1)||(bChar1 >= 0xC0))
{
// 保存码长信息
lpDst[dwBuffUsed] = iCount | 0xC0;
// 保存bChar1
lpDst[dwBuffUsed + 1] = bChar1;
// 更新dwBuffUsed
dwBuffUsed += 2;
}
else
{
// 直接保存该值
lpDst[dwBuffUsed] = bChar1;
// 更新dwBuffUsed
dwBuffUsed ++;
}
// 重新给bChar1赋值
bChar1 = bChar2;
// 设置iCount为1
iCount = 1;} }
// 保存每行最后一部分编码
if((iCount > 1)||(bChar1 >= 0xC0)){ // 保存码长信息
lpDst[dwBuffUsed] = iCount | 0xC0;
// 保存bChar1
lpDst[dwBuffUsed + 1] = bChar1;
// 更新dwBuffUsed
dwBuffUsed += 2;
}
else
{
// 直接保存该值
lpDst[dwBuffUsed] = bChar1;
// 更新dwBuffUsed
dwBuffUsed ++;
} }
lpDstBytes = dwBuffUsed;//返回编码后的图像字节数
// 写入编码结果
//file.WriteHuge((LPSTR)lpDst, dwBuffUsed);
// 释放内存
//delete lpDst;
//**************************************************************************
return true;}
多媒体技术与应用 多媒体技术与应用(课程代码06367)一、单项选择题1.下列采样的波形声音中,质量最好的是 A、单声道、32位量化、44.1kHz采样频率 B、双声道、32位量化、22.05kH......
多媒体技术与应用学习心得本学期学习的多媒体技术与应用这门课程已经结课,通过学习这门课程,我学到了一些以前不曾学到的知识,认识到自己的不足之处,对此有一些深刻的体会。在本......
刀豆文库小编为你整合推荐5篇多媒体技术与应用学习心得,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
一、选择题:⒈ 多媒体的关键特性主要包括信息载体的多样化、交互性和( D)A.活动性 B.可视性 C.规范化 D.集成性⒉ 以下( ) 不是数字图形、图像的常用文件格式A.BMP C.GIF D......
1.什么是媒体?它是如何分类的?所谓媒体,是指信息表示、存储和传输的载体。媒体的含义:一是指用以存储信息的物理实体,二是指信息的表现形式。 分类:①:感觉媒体、表示媒体、显示媒......