实验一常见压缩软件的使用一、实验目的使用一些常见的压缩软件,对数据压缩的概念、分类、技术和标准形成初步的认识和理解。
二、实验要求1.认真阅读实验指导书,按实验步骤完成实验内容。
2.实验过程中注意思考实验提出的问题,并通过实验解释这些问题。
3.通过实验达到实验目的。
三、实验环境计算机硬件:CPU处理速度1GHz以上,内存258M以上,硬盘10G以上软件:Windows操作系统2000或XP。
四、实验内容1.使用WinZip或WinRAR两种压缩软件分别对文本文件(.txt,.doc)、程序源代码文件(.c)、数据文件(.dat)、二进制目标代码文件(.obj)、图像文件(.bmp)、音频文件(.wav)和视频文件(.avi,.wmv)进行压缩,分别计算出压缩率,判断这两种压缩软件采用的是可逆压缩还是不可以压缩,猜测其可能用到了那些压缩(编码)技术?2.使用jpegimager、TAK和BADAK分别进行图像、音频和视频的压缩,体验其压缩效果。
3.使用bcl程序对文本文件、程序源代码文件、数据文件、二进制目标代码文件、图像文件等进行多种统计编码技术的压缩,包括香农-费诺(shannon-fano)编码、霍夫曼(huffman)编码、游程编码rle、字典编码lz等,记录每种压缩方法对不同类型文件的压缩效果并进行比较,结合所学知识,解释其中的原因。
五、实验步骤1、下载并打开WinZip和WinRAR两种压缩软件2、分别新建两个文档:qqjj.winzip 和winrar。
添加所要压缩的文件:文本文件(.txt,.doc)、程序源代码文件(.c)、数据文件(.dat)、二进制目标代码文件(.obj)、图像文件(.bmp)、音频文件(.wav)和视频文件(.avi,.wmv)进行压缩,如图所示:3、WinZip压缩软件可以直接看出各文件的压缩率,而winrar压缩软件不能直接看出各文件的压缩率,要在winrar压缩软件的屏幕上只显示一个压缩文件时,右健该压缩文件,点击显示信息方可看到该压缩文件的压缩率。
例如black的压缩率,如图所示:用类似的方法可以看到其它文件的压缩率。
Microsoft.txt为48%,outline.doc为18%,shannonfano.c为25%,,shannonfano.obj为39%,tu.bmp为1%,star.wav为95%,clock.avi 六、实验结论WinZip和WinRAR两种压缩软件采用的是可逆压缩,WinRAR是通过牺牲压缩效率来增强压缩比的!winzip在现有压缩文件里再添加文件比WINRAR更快。
追求速度选WINZIP,追求功能选WINRAR 。
七、实验总结通过这次实验,懂得使用一些常见的压缩软件,对数据压缩的概念、分类、技术和标准形成初步的认识和理解。
以及体会到一些常用压缩软件的优势。
实验二、霍夫曼编解码一、实验目的1.掌握r元Huffman编码的方法;2.了解Huffman编码效率及冗余度的计算;3、了解用matlab实现Huffman编码的方法。
二、实验要求掌握了解霍夫曼编码的原理和过程三、实验内容(叙述操作过程,提交主要程序段)打开软件。
输入以下程序,保存运行即可得到实验结论。
function [h,l]=huffman(p)p=[0.1 0.3 0.05 0.09 0.21 0.25];if (length(find(p<0))~=0)error('Not a prob,negative component');endif (abs(sum(p)-1)>10e-10)error('Not a prob.vector,component do not add to 1')endn=length(p);q=p;m=zeros(n-1,n);for i=1:n-1[q,l]=sort(q); %对q排序,排序结果存放在q中,元素位置存放在l中m(i,:)=[l(1:n-i+1),zeros(1,i-1)];q=[q(1)+q(2),q(3:n),1];endfor i=1:n-1c(i,:)=blanks(n*n);endc(n-1,n)='0'; %c存放编码,开始编码c(n-1,2*n)='1'; %先设置第一次的两个分支,2*n是为了拉开每个编码的距离,以便观看,可查看c的变化for i=2:n-1 %继续编码c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))...-(n-2):n*(find(m(n-i+1,:)==1)));c(n-i,n)='0';c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='1';for j=1:i-1c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,...n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));endendfor i=1:n %将最终的编码放在h中,ll存放每位的编码长度h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);ll(i)=length(find(abs(h(i,:))~=32));endl=sum(p.*ll); %计算平均码长r元(r=3)霍夫曼编码参考程序:clearp=[0.1 0.3 0.05 0.09 0.21 0.25];r=3;N=length(p);q=[p(1:N),zeros(1,ceil((N-r)/(r-1))*(r-1)+r-N)];n=length(q);A=(n-r)/(r-1)+1;m=zeros(A,n);for i=1:A[q,l]=sort(q);m(i,:)=[l(1:n-2*(i-1)),zeros(1,2*(i-1))];q=[sum(q(1:r)),q(r+1:n),ones(1,r-1)];endfor i=1:Ac(i,:)=blanks(n*n);endc(A,n)='0';c(A,2*n)='1';c(A,3*n)='2';for i=1:(A-1)c(A-i,1:n-1)=c(A-i+1,n*(find(m(A-i+1,:)==1))...-(n-2):n*(find(m(A-i+1,:)==1)));c(A-i,n)='0';c(A-i,n+1:2*n-1)=c(A-i,1:n-1);c(A-i,2*n)='1';c(A-i,2*n+1:3*n-1)=c(A-i,1:n-1);c(A-i,3*n)='2';for j=1:2*ic(A-i,(j+2)*n+1:(j+3)*n)=c(A-i+1,n*(find(m(A-i+1,:)...==j+1)-1)+1:n*find(m(A-i+1,:)==j+1));endendfor i=1:Nh(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n)ll(i)=length(find(abs(h(i,:))~=32))endH=-sum(p.*log2(p))l=sum(p.*ll)Q=H/(l*log2(r))四、实验结论h =20ll =2h =201ll =2 1h =201211ll =2 1 3h =201211212ll =2 13 3h =20121121222ll =2 13 3 2h =20121121222ll =2 13 3 2 1H =2.3549l =1.5900Q =0.9344五、实验总结掌握r元Huffman编码的方法;了解Huffman编码效率及冗余度的计算和用matlab实现Huffman编码的方法。
实验三附加、MATLAB的图像操作一、实验目的1掌握MATLAB的常规操作以及对图像的操作;2掌握MATLAB的基本编程。
二、实验要求了解掌握MATLAB三、实验内容(叙述操作过程,提交主要程序段)打开MATLAB,输入以下程序,把相关图片放入C盘中,修改相应的后缀各,运行即可得出实验结论。
2、显示有格式图像lenna.bmpi1=imread('c:\dpcm.jpg'); %注意图片放置的位置,是否固定?i1=rgb2gray(i1); %有什么作用?i1=imcrop(i1,[20 20 160 160]); %有何作用?区域是否可以改变?剪切后得到的矩形的尺寸一般和设定的区域是不一样的,要包括周围的像素点,所以一般会比设定的区域要大,可观察一下m,n值I=double(i1);[m,n]=size(i);p=zeros(m,n);%存放预测值y=zeros(m,n);%存放差值y(1:m,1)=i(1:m,1);p(1:m,1)=i(1:m,1);y(1,1:n)=i(1,1:n);p(1,1:n)=i(1,1:n);y(1:m,n)=i(1:m,n);p(1:m,n)=i(1:m,n);p(m,1:n)=i(m,1:n);y(m,1:n)=i(m,1:n);%以上语句是何用途?for k=2:m-1;for s=2:n-1;y(k,s)=(i(k,s-1)/2+i(k-1,s)/4+i(k-1,s-1)/8+i(k-1,s+1)/8);p(k,s)=round(i(k,s)-y(k,s));endendp=round(p);subplot(3,2,1),imshow(i1);title('原灰度图像');subplot(3,2,2),imshow(y,[0 256]);title('利用相邻块线性预测后的图像');subplot(3,2,3),imshow(abs(p),[0 1]);title('编码的绝对残差图像');j=zeros(m,n);j(1:m,1)=y(1:m,1);j(1,1:n)=y(1,1:n);j(1:m,n)=y(1:m,n);j(m,1:n)=y(m,1:n);for k=2:m-1;for s=2:n-1;j(k,s)=p(k,s)+y(k,s);endendfor r=1:mfor t=1:nd(r,t)=round(i(r,t)-j(r,t));endendsubplot(3,2,4),imshow(abs(p),[0 1]);title('解码用的残差图像');subplot(3,2,5),imshow(j,[0 256]);title('使用残差和线性预测重建后的图像'); subplot(3,2,6),imshow(abs(d),[0 1]);title('解码重建后图像的误差');四、实验结论五、实验总结通过这次实验,熟悉了MATLAB软件的操作环境并掌握了MATLAB的常规操作以及对图像的操作;还掌握了MATLAB的基本编程。