实验三 基于DCT编码的JPEG压缩

来源:互联网 发布:基础c语言代码实例 编辑:程序博客网 时间:2024/06/07 14:35

一. 实验目的与要求
1. 进一步熟悉DCT的概念和原理;
2. 利用DCT变换编码方法进行图像压缩,提高信息传输的有效性及通信质量。
3. 掌握对灰度和彩色图像作离散余弦变换和反变换的方法;
4. 能选择适当的量化间隔、阈值和区域进行编码;
二、实验环境
Windows+matlab
三、实验原理
变换编码是通过变换来解除或减弱信源符号间的相关性,再将变换后的样值进行量化,或采用对于独立信源符号的编码方法,以达到压缩码率的目的。离散余弦变换(DCT for Discrete Cosine Transform)是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数基于DCT(离散余弦变换)压缩编码算法是有失真的压缩编码,如图1-1为DCT变换编码原理图。
这里写图片描述
在编码过程中,首先将输入图像分解为8×8大小的数据块,然后用正向二维DCT把每个块转变成64个DCT系数值,其中左上角第一个数值是直流(DC)系数,即8×8空域图像子块的平均值,其余的63个是交流(AC)系数,接下来对DCT系数进行量化,最后将变换得到的量化的DCT系数进行编码和传送,这样就完成了图像的压缩过程。
四、实验内容和步骤
1. 随机选取一整幅图像进行DCT变换,编写程序显示灰度图像、反余弦变换恢复图、DCT变换图、余弦变换系数图、变换谱三维彩色图。该方法出发点是对整幅图像进行DCT变换,主要应用MATLAB的图像处理工具箱中的基于FFT的有大量输入的快速算法进行处理的dct2函数。

clcclearA=imread('D:\x.jpg');I=rgb2gray(A);DCT=dct2(I);         %余弦变化DCT(abs(DCT)<10)=0;  %把变换矩阵中小于10的值置换为0,然后用idct2重构IDCT=idct2(DCT);subplot(2,2,1),imshow(I);title('灰度图像')subplot(2,2,2),imshow(IDCT,[0 255]);title('反余弦变换恢复图')subplot(2,2,3),imshow(DCT);title('DCT变换')subplot(2,2,4),imshow(log(abs(DCT)),[]);title('余弦变换系数');figure,mesh(DCT);title('变换谱三维彩色图')
  1. 随机选取一幅图像先将图像分解为8*8或16*16个数据块,然后分别对分解后的每个数据小方块进行DCT变换。编写程序,对图像进行压缩,参考程序如下所示。该方法的出发点是先将图像分解为8*8或16*16个数据块,然后分别对分解后的每个数据小方块进行DCT变换,主要应用MATLAB的图像处理工具箱中dctmtx函数返回DCT变换矩阵,而后进行相关处理。
clcclearA=imread('D:\x.jpg');I=rgb2gray(A);I=im2double(I);%将图像转换为双精度格式T=dctmtx(8);%返回一个8*8的DCT变换矩阵B=blkproc(I,[8 8],'P1*x*P2',T,T');%对原图像进行DCT变换mask=[0 0 0 0 1 1 1 1      0 0 0 1 1 1 1 1      0 0 1 1 1 1 1 1      0 1 1 1 1 1 1 1      1 1 1 1 1 1 1 1      1 1 1 1 1 1 1 1      1 1 1 1 1 1 1 1      1 1 1 1 1 1 1 1];%保留了10个DCT系数重构图像B2=blkproc(B,[8 8],'P1.*x',mask);%数据压缩,丢弃右下角高频数据I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像subplot(1,2,1),imshow(I)title('原始图像')subplot(1,2,2),imshow(I2)title('压缩图像1')disp('压缩后图像I2的大小');whos('I2');disp('压缩前图像A的大小');whos('A');disp('压缩后图像I的大小');whos('I');

五、实验结果与分析
1.分析“反余弦变换恢复图”与原始图像的区别,分析DCT系数的分布规律,列出实验结果。
2. 分别列出保留左上角3、10、32、54个DCT系数的压缩图像,分析其压缩效果。列出左上角3、10个DCT系数为0其他数据为1的压缩图像,分析其实验结果。

0 0
原创粉丝点击