视音频实验 1.docx
- 文档编号:9164142
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:18
- 大小:404.05KB
视音频实验 1.docx
《视音频实验 1.docx》由会员分享,可在线阅读,更多相关《视音频实验 1.docx(18页珍藏版)》请在冰豆网上搜索。
视音频实验1
任课教师:
张海翔
《视音频信号处理》
(2013-2014学年第1学期)
实
验
报
告
学号:
姓名:
班级:
实验一多媒体数据的压缩
一、实验目的
1.掌握音频信号处理和图像数据处理方法和技术。
2、掌握霍夫曼编码、算术编码、游程编码等编码算法的思想。
3、学会利用多种编码算法实现对图像文件的压缩。
4、掌握图像的矩阵存储方式,并且实现图像矩阵数据文件的读取操作。
5、利用游程编码算法编写程序实现对图像的编码。
二、实验内容
1、请用研究和分析“熵编码源程序”,用“哈夫曼编码”、“算术编码”、“游程编码”此程序对“lena.bmp”(图像文件)进行压缩处理,并比较三种编码算法的压缩比。
2、请编写一个图像矩阵产生程序,具体要求为:
a)图像大小为256*256;
b)图像矩阵中的点p(I,j)=i*256+j;
c)将图像矩阵保存为数据文件,文件名请自行命名。
d)将数据文件中的图像矩阵数据读取到图像矩阵中。
3、用设计和编写游程编码对黑白bmp图像文件进行游程编码,并给出游程编码的压缩比。
黑白bmp图像文件中要包括自己的名字、学号等图案。
4、请根据教材《多媒体技术基础》中的2.2.3部分算术编码算法的原理,编写算术编码程序,并给出对序列a,c,b,d进行编码后的概率区间。
符号[a,b,c,d]对应的概率分布为[0.1,0.4,0.3,0.2]。
3、实验过程
1、请用研究和分析“熵编码源程序”,用“哈夫曼编码”、“算术编码”、“游程编码”此程序对“lena.bmp”(图像文件)进行压缩处理,并比较三种编码算法的压缩比。
1.1打开“熵编码源程序”,运行程序发现编码对象选项中并没有bmp格式的选项:
所以应先对代码中的ACDialog.cpp、HuffencodeDialog.cpp以及RunlengthDialog.cpp中的代码进行如下修改:
1.2运行程序,选择霍夫曼编码、算术编码、游程编码,依次对bmp格式的图片进行编码,并比较三种编码的压缩比.
2、请编写一个图像矩阵产生程序,具体要求为:
e)图像大小为256*256;
f)图像矩阵中的点p(I,j)=i*256+j;
g)将图像矩阵保存为数据文件,文件名请自行命名。
h)将数据文件中的图像矩阵数据读取到图像矩阵中。
3、用设计和编写游程编码对黑白bmp图像文件进行游程编码,并给出游程编码的压缩比。
黑白bmp图像文件中要包括自己的名字、学号等图案。
4、请根据教材《多媒体技术基础》中的2.2.3部分算术编码算法的原理,编写算术编码程序,并给出对序列a,c,b,d进行编码后的概率区间。
符号[a,b,c,d]对应的概率分布为[0.1,0.4,0.3,0.2]。
四、实验代码
2、矩阵程序代码
#include
#include
//游程编码函数
voidrunlength_en(FILE*ifile,FILE*ofile)
{
//读图象数据
unsignedcharimage[256][256];
unsignedcharbuf[65535];
intwidth=256,height=256;
inti,j,k,sign;
inttmp,num;
for(i=0;i fread(&image[i][0],sizeof(unsignedchar),width,ifile); fclose(ifile); sign=0;k=0; for(i=0;i { for(j=0;j { if(sign==0) { tmp=image[i][j]; sign=1; num=1; } else { if(tmp==image[i][j]) { if(num<256)num++; else { buf[k]=tmp; buf[k+1]=num; k=k+2; tmp=image[i][j]; sign=1; num=1; } } else { buf[k]=tmp; buf[k+1]=num; k=k+2; tmp=image[i][j]; sign=1; num=1; } } } } fwrite(&width,sizeof(unsignedint),1,ofile); fwrite(&height,sizeof(unsignedint),1,ofile); fputc(256,ofile); fwrite(&k,sizeof(unsignedint),1,ofile); fwrite(buf,sizeof(unsignedchar),k,ofile); fclose(ofile); } //游程解码函数 voidrunlength_de(FILE*ifile,FILE*ofile) { unsignedcharimage[256][256]; unsignedcharbuf[65535*2]; intwidth=256,height=256; intlength; inti,j,k; fread(&width,sizeof(int),1,ifile); fread(&height,sizeof(int),1,ifile); fgetc(ifile); fread(&length,sizeof(int),1,ifile); fread(buf,sizeof(unsignedchar),length,ifile); fclose(ifile); k=0; for(i=0;i { for(j=0;j { if(buf[k+1]>0) { image[i][j]=buf[k]; buf[k+1]--; } else { k=k+2; image[i][j]=buf[k]; buf[k+1]--; } } } for(i=0;i { fwrite(&image[i][0],sizeof(unsignedchar),width,ofile); } fclose(ofile); } intmain() { charp[256][256]; inti,j; FILE*file,*enfile,*defile; if(! (file=fopen("picture.raw","wb+"))) { printf("cannotopenpicture! \n"); } for(i=0;i<256;i++) { for(j=0;j<256;j++) { p[i][j]=256*i+j; fputc(p[i][j],file); } } fclose(file); if(! (file=fopen("picture.raw","rb+"))) { printf("cannotopenpicture! \n"); } if(! (enfile=fopen("epicture.run","wb+"))) { printf("cannotopenecodefile! \n"); } runlength_en(file,enfile); printf("编码结束! \n"); if(! (enfile=fopen("epicture.run","rb+"))) { printf("cannotopenecodefile! \n"); } if(! (defile=fopen("dpicture.raw","wb+"))) { printf("cannotopendcodefile! \n"); } runlength_de(enfile,defile); printf("译码结束! \n"); system("pause"); return0; } 3、游程编码 #include #include voidrunlength_encode(FILE*ifile,FILE*ofile)//对图像数据进行编码 { unsignedcharimage[260][260]; unsignedcharbuf[67600];//存放编码数据 intwidth=260,height=260;//设置矩阵的宽高, inttmp,num; inti,j,k,sign; for(i=0;i fread(&image[i][0],sizeof(unsignedchar),width,ifile);//读取file.raw中的图像数据 fclose(ifile); sign=0; k=0; for(i=0;i { for(j=0;j { if(sign==0)//计算该种像素的个数 { tmp=image[i][j]; sign=1; num=1; } else//计算该种像素的个数 { if(tmp==image[i][j]) { if(num<256) num++;//统计该种像素的个数 else { buf[k]=tmp; buf[k+1]=num;//设置k+1表示该种像素的数量 k=k+2; tmp=image[i][j]; sign=1; num=1; } } else { buf[k]=tmp; buf[k+1]=num; k=k+2; tmp=image[i][j]; sign=1; num=1; } } } } fwrite(&width,sizeof(unsignedint),1,ofile);//将宽读入文件 fwrite(&height,sizeof(unsignedint),1,ofile);//将高读入文件 fputc(256,ofile); fwrite(&k,sizeof(unsignedint),1,ofile); fwrite(buf,sizeof(unsignedchar),k,ofile);//将编码读入文件 fclose(ofile); } voidrunlength_decode(FILE*ifile,FILE*ofile)//对图像数据进行译码 { unsignedcharimage[260][260]; unsignedcharbuf[67600+2]; intwidth=260,height=260; intlength; inti,j,k; fread(&width,sizeof(int),1,ifile); fread(&height,sizeof(int),1,ifile); fgetc(ifile); fread(&length,sizeof(int),1,ifile); fread(buf,sizeof(unsignedchar),length,ifile); fclose(ifile); k=0; for(i=0;i { for(j=0;j { if(buf[k+1]>0) { image[i][j]=buf[k]; buf[k+1]--;//每译码一个,该种像素的数量减 } else { k=k+2; image[i][j]=buf[k]; buf[k+1]--; } } } for(i=0;i { fwrite(&image[i][0],sizeof(unsignedchar),width,ofile);//将译得的图像数据写入文件 } fclose(ofile); } intmain() { charp[256][256];//定义一个256*256图像矩阵 inti,j; FILE*file,*enfile,*defile; if(! (file=fopen("hjy.bmp","rb+"))) { printf("打开文件失败! \n"); } fclose(file); if(! (file=fopen("hjy.bmp","rb+"))) { printf("打开hjy.bmp文件失败! \n"); } if(! (enfile=fopen("hjy.run","wb+"))) { printf("打开hjy.run文件失败! \n"); } runlength_encode(file,enfile); printf("编码结束! \n"); if(! (enfile=fopen("hjy.run","rb+"))) { printf("打开hjy.run文件失败! \n"); } if(! (defile=fopen("dhjy.bmp","wb+"))) { printf("打开dhjy.bmp文件失败! \n"); } runlength_decode(enfile,defile); printf("译码结束! \n"); if(! (defile=fopen("dhjy.bmp","rb+"))) { printf("打开dhjy.bmp文件失败! \n"); } return0; } 4、算术编码 #include usingnamespacestd; intmain() { chartemp[4]; floatm=0,n=1.0,t; for(inti=0;i<4;i++) { scanf("%c",&temp[i]); getchar();//接受回车 switch(temp[i]) { case'a': //为a时的区间改变 m+=n*(0.0);n=n*(0.1);t=m+n; break; case'b': m+=n*(0.1);n=n*(0.4);t=m+n; break; case'c': m+=n*(0.5);n=n*(0.3);t=m+n; break; case'd': m+=n*(0.8);n=n*(0.2);t=m+n; break; default: break; } } //输出结果 printf("序列[%c,%c,%c,%c]的概率区间[%f,%f)\n",temp[0],temp[1],temp[2],temp[3],m,t); system("pause"); return0; } 五、实验结果 1、研究熵编码源程序 霍夫曼编码结果: 算术编码结果: 游程编码结果: 且原图像大小为 则三种编码的压缩比分别为: 霍夫曼编码压缩比257/241=1.066 算术编码压缩比257/58.3=4.408 游程编码压缩比257/116=2.216 2、图像矩阵产生程序 运行界面: 运行后所生成的文件: 图像矩阵的存储文件: 转换的数据文件: 从数据文件转换而来的图像文件: 矩阵图像: 从数据文件转换而来的图像: 3、对自身设计的黑白bmp文件使用游程编码压缩结果 运行后所生成的文件: 待编码的位图: 待编码的文件: 转换的数据文件: 从数据文件转换而来的图像文件: 游程编码压缩比为: 65/66=0.985 4、算术编码结果 六、实验心得
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 视音频实验 音频 实验