预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验四图像压缩 姓名:学号: 邮箱: 实验目的 掌握DCT变换的原理 了解DCT变化在图像压缩中的应用 掌握图像压缩的基本原理及方法 了解霍夫曼编码原理 熟悉图像压缩的MATLAB编程 实验原理 DCT是目前比较好的图像变换,它有很多优点。DCT是正交变换,它可以将8x8图像空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,如采用快速傅立叶变换可以进行高效的运算,因此它在硬件和软件中都容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。 由于DCT主要应用在数据和图像的压缩,因此希望原信号的能量在变换后能尽量集中在少数系数上,且这些大能量的系数能处在相对集中的位置,这将有利于进一步的量化和编码。但是如果对整段的数据或整幅图像来做DCT,那就很难保证大能量的系数能处在相对集中的位置。因此,在实际应用中,一般都是将数据分成一段一段来做,一般分成8x8或16x16的方块来做。 二维DCT正交变换的公式为: 二维DCT逆变换公式: 其中 实验要求 利用DCT变换对图像进行压缩,对比不同压缩比下的结果,对比不同压缩比下图像大小的变化。压缩过程如下图所示: 读入图像 DCT变换 量化 huffman编码 实验过程与结果 实验程序如下:(先给出主程序,然后给出各功能子函数的程序) 主程序: clear load('lena.mat')%调入170*170大小的一幅彩色lena图像 l=imresize(lena,[256256]);%将图像变换为8的整数倍大小 X=rgb2gray(l); Y1=double(X);%读入图像数据 lianghua=[1611101624405161;%量化矩阵,量化的程度序决定压缩比 1212141926586055; 1413162440576956; 1417222951878062; 182237566810910377; 243555648110411392; 49647887103121120101; 7292959811210010399]; ilianghua=lianghua; %---------------------------------------------------------- %图像压缩 %---------------------------------------------------------- t=dctmtx(8); J=blkproc(Y1,[88],'P1*x*P2',t,t');%分成8*8块进行DCT变换 M=blkproc(J,[88],'round(x./P1)',lianghua);%量化 u=abs(min(min(M1)); M=(M1./u)+1; data=uint8(M);%Huffman编码要求为无符号整形数组 M2=M-double(data); [zipped,info]=huffencode(data);%调用Huffman编码程序进行压缩 unzipped=huffdecode(zipped,info,data);%调用Huffman解码程序进行解压缩 k=1; fori=1:256 forj=1:256 unzippedray(i,j)=unzipped(k); k=k+1; end end unzippedray=unzippedray';%对解压缩后得到的一维数组进行变换,得到无损的量化后 %二维数组,其值与data数组值是一致的,体现了Huffman编码是一种无损编码 unzippedray=(double(unzippedray)-1+M2).*u; T=blkproc(unzippedray,[88],'x.*P1',ilianghua);%反量化 I=blkproc(T,[88],'P1*x*P2',t',t);%8*8DCT反变换 %---------------------------------------------------------- %调用Huffman编码程序进行解码 %显示原始图像和经编码后的图像,显示压缩比,并计算均方根误差得erms=0,表示是Huffman是无失真编码 figure subplot(221);imshow(Y1,[]);axissquare;xlabel('原256*256灰度图像'); subplot(222);imshow(I,[]);axissquare;xlabel('Huffman解压缩后图像'); subplot(223);imshow((Y1-I),[]);axissquare;xlabel('量化后损失