图像压缩实验指导书
- 格式:doc
- 大小:1003.00 KB
- 文档页数:9
JPEG静图像压缩实验
一.实验目的
1.了解数字图像压缩的一类方法
2.掌握2D快速DCT变换的算法
二.实验原理
JPEG标准是面向连续色调静止图像的图像压缩标准。
它定义了多种类型的工作模式,其中最基本的是基于8*8块的DCT变换的顺序编码。
就是将一帧图像分为8*8的数据块单元,按照从左到右,自上到下的顺序对”块流”编码,其编码解码框图如下:
三.实验内容
按照如上框图实现一帧图像的压缩编码和解码
四.代码理解
1.编码主程序
五、实验结果
六.思考题
1.计算图像压缩比,并比较原图像的效果
使用lady.dat做实验的图像压缩比为:63/5.436=11.8:1
左图为压缩前的lady.bmp,右图为压缩后的lady.jpg
两图没有明显的区别,但比较细节,右图稍微模糊,并且局部区域有一些块化现象。
2.改变g-scale和量化矩阵的元素,比较压缩比和恢复图像的效果
Gscale141625
压缩比 3.197.5418.122.91
G_scale=1G_scale=4
G_scale=16G_scale=25
量化矩阵Q1Q2
压缩比7.3418.44
Q1=0.5*Q0,Q2=2*Q0,Q0为原始的量化矩阵
Q1Q2
3.对于8bit的像素值,在经过DCT变换后,值域为[-2048,2047],有可能超过码表范围。
竭诚为您提供优质文档/双击可除图像压缩实验报告篇一:实验三图像压缩实验三图像压缩一、实验目的1.理解有损压缩和无损压缩的概念;2.理解图像压缩的主要原则和目的;3.了解几种常用的图像压缩编码方式。
4.利用mATLAb程序进行图像压缩。
二、实验仪器1计算机;2mATLAb等程序;3移动式存储器(软盘、u盘等)。
4记录用的笔、纸。
三、实验原理1.图像压缩原理图像压缩主要目的是为了节省存储空间,增加传输速度。
图像压缩的理想标准是信息丢失最少,压缩比例最大。
不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。
压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。
信息的冗余量有许多种,如空间冗余,时间冗余,结构冗余,知识冗余,视觉冗余等,数据压缩实质上是减少这些冗余量。
高效编码的主要方法是尽可能去除图像中的冗余成分,从而以最小的码元包含最大的图像信息。
编码压缩方法有许多种,从不同的角度出发有不同的分类方法,从信息论角度出发可分为两大类。
(1).冗余度压缩方法,也称无损压缩、信息保持编码或嫡编码。
具体说就是解码图像和压缩编码前的图像严格相同,没有失真,从数学上讲是一种可逆运算。
(2)信息量压缩方法,也称有损压缩、失真度编码或烟压缩编码。
也就是说解码图像和原始图像是有差别的,允许有一定的失真。
应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下3类:(1)无损压缩编码种类哈夫曼(huffman)编码,算术编码,行程(RLe)编码,Lempelzev编码。
(2)有损压缩编码种类预测编码,Dpcm,运动补偿;频率域方法:正交变换编码(如DcT),子带编码;空间域方法:统计分块编码;模型方法:分形编码,模型基编码;基于重要性:滤波,子采样,比特分配,向量量化;(3)混合编码。
有JbIg,h261,Jpeg,mpeg等技术标准。
实验六:图像有损压缩编码3146649一、实验目的掌握图像有损压缩编码方法。
二、实验属性验证性。
三、实验仪器设备及器材安装有matlab6.5的计算机及图像处理套件Ⅱ。
四、实验要求实验前预习matlab软件,对数字图像的滤波与增强算法有深入了解,并写有预习报告(包含算法的原码)。
实验过程中,注意观察实验结果与预期的是否一致。
实验后每个同学必须按要求独立完成实验报告。
五、实验步骤与结果分析1.图像压缩处理1棋盘图像压缩前棋盘图像压缩后原图像大小:Name Size Bytes Class AttributesI 40x40 12800 double压缩图像的大小:Name Size Bytes Class AttributesJ 1x400 3200 double图像的压缩比:42.图像压缩处理2(离散余弦变换压缩)原始图像压缩后的图像图像压缩处理方式1中,采用游程长度编码。
将40x40信息量为12800 bytes的图像转化为1x400信息量为3200 bytes的图像,图像压缩比为4。
图像压缩处理方式2中,采用离散余弦变换编码。
第1步:进行图像存储类型转换;第2步:返回n*n离散余弦变换矩阵,采用二维离散余弦变换函数dctmtx(n) ;第3步:对原图像进行DCT 变换;第4步:数据压缩,丢弃右下角高频数据;第6步进行DCT反变换,得到压缩后的图像;第7步:生成绘图窗口。
由图中可以看到余弦变换属于有损压缩,经DCT处理后的图像变得模糊了。
总结:图像压缩编码的方法很多,根据具体编码技术不同,可分为预测编码、变换编码、统计编码、轮廓编码、模型编码等。
本次试验分别采用统计编码和变换编码。
从实验结果能够看到两种方法的效果,都减少了平均码字长度,节省了存储空间。
六、实验代码1. I=checkerboard(10,2);%棋盘图像figure,imshow(I);title('棋盘图像压缩前');[m n]=size(I);J=[ ];for i=1:mvalue=I(i,1);num=1;for j=2:nif I(i,j)==valuenum=num+1;elseJ=[J num value];num=1;value=I(i,j);endendJ=[J num value 0 0];endfigure,imshow(J);title('棋盘图像压缩后');%添加的行判断位0 0disp('原图像大小:'),whos('I');disp('压缩图像的大小:'),whos('J');disp('图像的压缩比:');disp(m*n/length(J));2.I=imread('cameraman.tif');I=im2double(I);%图像存储类型转换T=dctmtx(8);%离散余弦变换矩阵B=blkproc(I,[8 8],'P1*x*P2',T,T');%B=blkproc(A,[m n],fun,P1,P2...) :块操作函数。
JPEG 静态图像压缩实验指导书一、实验目的1. 了解多媒体通信中图像压缩技术2. 熟悉 JPEG 图像压缩编码过程3. 掌握二维 DCT 变换算法二、实验原理JPEG(Joint Photographic Experts Group 是一个由 ISO 和 ITU-T 两个组织机构联合组成的一个图像专家小组,负责制定静态的数字图像数据压缩编码标准, 这个专家组开发的算法称为 JPEG 算法,并且成为国际上通用的标准。
JPEG 是一个适用范围很广的静态图像数据压缩标准, 既可用于灰度图像又可用于彩色图像。
JPEG 不仅适于静止图像的压缩,电视图像的帧内图像的压缩编码,也常采用此算法。
JPEG 标准定义了多种工作模式, 其中最基本的是基于 8×8块的 DCT 顺序编码,将一帧图像分为 8×8的块,然后按照从左至右、自上而下的顺序,对块进行 DCT 、量化和熵编码。
其编、解码框图如下:图 1 基于 DCT 的顺序编码框图DCT 解码器图 2 基于 DCT 的顺序解压缩框图JPEG 压缩编码算法的主要计算步骤:1 正向离散余弦变换 (FDCT。
2 量化 (quantization。
3 Z 字形编码 (zigzag scan。
4 使用差分脉冲编码调制 (differential pulse code modulation, DPCM 对直流系数(DC进行编码。
5 使用行程长度编码 (run-length encoding, RLE 对交流系数 (AC进行编码。
6 熵编码 (entropy coding。
三、实验内容按照上述压缩过程实现一幅图像的压缩,生成符合 JPEG 标准的图像文件 JPEG 图像编码流程如下:图 3 JPEG 图像编码流程1. DCT 变换对 8×8的图像数据块进行二维 DCT 的变换, 把能量集中在少数几个系数上,从而达到数据压缩的目的。
:DCT 变换公式 :DCT 反变换公式:其中:二维 DCT 变换可以分解为行和列的一维 DCT 变换的组合运算, 也可将 8×8的块分为更小的子块,直接对二维数据进行 2维快速余弦变换。
数字图像处理上机实验指导书童立靖北方工业大学计算机学院tong_lijing@北 方 工 业 大 学2016-5-19 第2页/共9页实验四 图像压缩一、实验目的、要求与环境1.1目的:通过实验,了解数字图象压缩的一般方法,掌握图像压缩的编程方法,了解图象压缩效果的评价方法。
1.2 要求:对自选的图象进行离散余弦变换,将其进行图象压缩处理,自行设计量化矩阵,与编码方法,并计算压缩比,提交实验报告。
进度较快的同学,可以设计三种不同的量化矩阵或编码方法,完成三种不同程度的压缩,对比解压缩后的图像质量,并进行分析。
(给分较高)1.3 环境:Windows 7操作系统Microsoft Visual Studio 2008自带8位灰度图像文件:lena-gray.bmp :北方工业大学二、实验步骤1.准备相关图像文件。
2.在Windows7 操作系统上,打开Microsoft Visual Studio 2008,编写相关程序,完成对离散余弦变换系数的量化矩阵设计与编码方法。
4.对程序进行相关调试,修改程序,去除其中的BUG。
5. 利用自己准备的图像的文件,和编写的程序,将给定的图象进行压缩处理。
6.截屏,保留实验结果。
7. 计算压缩比, 进行实验结果分析。
8. 撰写并提交实验报告。
三、注意事项1.实验任务:Windows下完成图像压缩的程序编写。
2.去多模式教学网上下载程序框架:DCT-Quantify8-Frame.rar。
3.图像高度、宽度须是8的倍数。
BMP 格式,8位灰度图像。
4.对于一幅彩色图像,可以在photoshop中,图像=》模式=》灰度=》扔掉文件=》存储为=》保存=》选择8位深度=》确定。
5.实验完成时间:先在课下完成程序编写,然后课上完成验机。
第15周的周一、第16周的周1,二次实验课。
6.请记录实验报告中相应的贴图:可以用屏幕拷贝,然后再用Photoshop中的工具中修剪一下。
实验三、图像压缩一.实验目的1.理解有损压缩和无损压缩的概念;2.理解图像压缩的主要原则和目的;3.了解几种常用的图像压缩编码方式。
4.利用MATLAB程序进行图像压缩。
二.实验原理1.图像压缩原理图像压缩主要目的是为了节省存储空间,增加传输速度。
图像压缩的理想标准是信息丢失最少,压缩比例最大。
不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。
压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。
信息的冗余量有许多种,如空间冗余,时间冗余,结构冗余,知识冗余,视觉冗余等,数据压缩实质上是减少这些冗余量。
高效编码的主要方法是尽可能去除图像中的冗余成分,从而以最小的码元包含最大的图像信息。
编码压缩方法有许多种,从不同的角度出发有不同的分类方法,从信息论角度出发可分为两大类。
(1).冗余度压缩方法,也称无损压缩、信息保持编码或嫡编码。
具体说就是解码图像和压缩编码前的图像严格相同,没有失真,从数学上讲是一种可逆运算。
(2)信息量压缩方法,也称有损压缩、失真度编码或烟压缩编码。
也就是说解码图像和原始图像是有差别的,允许有一定的失真。
应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下3类:(1)无损压缩编码种类哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。
(2)有损压缩编码种类预测编码,DPCM,运动补偿;频率域方法:正交变换编码(如DCT),子带编码;空间域方法:统计分块编码;模型方法:分形编码,模型基编码;基于重要性:滤波,子采样,比特分配,向量量化;(3)混合编码。
有JBIG,H261,JPEG,MPEG等技术标准。
本实验主要利用MA TLAB程序进行离散余弦变换(DCT)压缩和行程编码(Run Length Encoding,RLE)。
1)离散余弦变换(DCT)图像压缩原理离散余弦变换DCT在图像压缩中具有广泛的应用,它是JPEG、MPEG等数据压缩标准的重要数学基础。
数字图像处理实验指导书电气信息工程系实验中心2008年8月目 录实验一、数字图像获取实验二、图像的傅立叶变换实验三、图像增强实验四、图像压缩实验一、数字图像获取一、实验目的1.掌握使用扫描仪等数字化设备以及计算机获取数字图像的方法;2.修改图像的存储格式。
二、实验仪器1.计算机;2.扫描仪(或数码相机、数字摄像机)及其驱动程序盘;3.图像处理软件(画图,photoshop, Microsoft photo edit等);4.记录用的笔、纸。
三、 实验内容用扫描仪获取图像也是图像的数字化过程的方法之一,扫描仪按种类可以分为手持扫描仪,台式扫描仪和滚筒式扫描仪(鼓形扫描仪)。
扫描仪的主要性能指标有x、y方向的分辨率、色彩分辨率(色彩位数)、扫描幅面和接口方式等。
各类扫描仪都标明了它的光学分辨率和最大分辨率。
分辨率的单位是dpi,dpi是英文Dot Per Inch的缩写,意思是每英寸的像素点数。
扫描仪工作时,首先由光源将光线照在欲输入的图稿上,产生表示图像特征的反射光(反射稿)或透射光(透射稿)。
光学系统采集这些光线,将其聚焦在CCD上,由CCD将光信号转换为电信号,然后由电路部分对这些信号进行A/D转换及处理,产生对应的数字信号输送给计算机。
当机械传动机构在控制电路的控制下,带动装有光学系统和CCD的扫描头与图稿进行相对运动,将图稿全部扫描一遍,一幅完整的图像就输入到计算机中去了。
图1.1扫描仪的工作原理扫描仪扫描图像的步骤是:首先将欲扫描的原稿正面朝下铺在扫描仪的玻璃板上,原稿可以是文字稿件或者图纸照片;然后启动扫描仪驱动程序后,安装在扫描仪内部的可移动光源开始扫描原稿。
为了均匀照亮稿件,扫描仪光源为长条形,并沿y方向扫过整个原稿;照射到原稿上的光线经反射后穿过一个很窄的缝隙,形成沿x方向的光带,又经过一组反光镜,由光学透镜聚焦并进入分光镜,经过棱镜和红绿蓝三色滤色镜得到的RGB三条彩色光带分别照到各自的CCD上,CCD将RGB光带转变为模拟电子信号,此信号又被A/D变换器转变为数字电子信号。
实验六图像压缩课程名称:数字图像处理技术实验日期:2016-11-17班级:姓名:学号:一、实验目的1.了解图像压缩的基本操作;2.掌握行程编码算法、哈夫曼编码算法;3. 掌握边缘检测的Matlab实现方法。
二、实验内容1. 在GUI中,实现灰度图像、彩色图像的行程编码的编码器算法;进一步实现行程编码的解码器算法,并比较原图像和解码图像是否有区别。
2. 在GUI中,实现图像的边缘检测, 比较'roberts','sobel',算子的检测效果。
三、实验代码function axes1_CreateFcn(hObject, eventdata, handles)% hObject handle to axes1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called imshow('1.jpg')% Hint: place code in OpeningFcn to populate axes1% --- Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)figure;A=imread('1.jpg');image1=rgb2gray(A);subplot(2,2,1);imshow(image1);image2=image1(:);image2length=length(image2);for i=1:1:image2lengthif image2(i)>=127image2(i)=255;elseimage2(i)=0;endendimage3=reshape(image2,320,240);subplot(2,2,2);imshow(image3);X=image3(:);x=1:1:length(X);plot(x,X(x));j=1;image4(1)=1;for z=1:1:(length(X)-1)if X(z)==X(z+1)image4(j)=image4(j)+1;elsedata(j)=X(z);j=j+1;image4(j)=1;endenddata(j)=X(length(X));image4length=length(image4);y=1:1:image4length;plot(y,image4(y));CR=image2length/image4length;l=1;for m=1:image4lengthfor n=1:1:image4(m);rec_image(l)=data(m);l=l+1;endendu=1:1:length(rec_image);plot(u,rec_image(u));rec2_image=reshape(rec_image,320,240);subplot(2,2,3);imshow(rec2_image);% --- Executes on button press in pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) figure;clear all;I1=imread('1.jpg');I2=im2bw(I1,0.5);I3=I2(:)';I3len=length(I3);j=1;n=1;for z=1:(I3len-1)if I3(z)==I3(z+1)n=n+1;elsepixel(j)=I3(z);numpixel(j)=n;j=j+1;n=1;endendpixel(j)=I3(z+1);numpixel(j)=n;pixel_len=length(pixel);CR=I3len/pixel_len;disp('压缩比:')disp(CR);disp('原图像数据的长度:')disp(I3len);disp('压缩后图像数据的长度:')disp(pixel_len);% --- Executes on button press in pushbutton3.function pushbutton3_Callback(hObject, eventdata, handles)% hObject handle to pushbutton3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) figure;A=imread('095.jpg');image1=rgb2gray(A);figure;imshow(image1);image2=image1(:);image2length=length(image2);for i=1:1:image2lengthif image2(i)>=127image2(i)=255;elseimage2(i)=0;endendimage3=reshape(image2,1360,1020);figure;imshow(image3);X=image3(:);x=1:1:length(X);figure;plot(x,X(x));j=1;image4(1)=1;for z=1:1:(length(X)-1)if X(z)==X(z+1)image4(j)=image4(j)+1;elsedata(j)=X(z);j=j+1;image4(j)=1;endenddata(j)=X(length(X));image4length=length(image4);y=1:1:image4length ;figure;plot(y,image4(y));CR=image2length/image4length;l=1;for m=1:image4lengthfor n=1:1:image4(m);rec_image(l)=data(m);l=l+1;endendu=1:1:length(rec_image);figure;plot(u,rec_image(u));rec2_image=reshape(rec_image,1360,1020);figure;imshow(rec2_image);% --- Executes on button press in pushbutton4.function pushbutton4_Callback(hObject, eventdata, handles)% hObject handle to pushbutton4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) figure;A=imread('1.jpg');image1=rgb2gray(A);figure;imshow(image1);image2=image1(:);image2length=length(image2);for i=1:1:image2lengthif image2(i)>=127image2(i)=255;image2(i)=0;endendimage3=reshape(image2,320,240);figure;imshow(image3);X=image3(:);x=1:1:length(X);figure;plot(x,X(x));j=1;image4(1)=1;for z=1:1:(length(X)-1)if X(z)==X(z+1)image4(j)=image4(j)+1;elsedata(j)=X(z);j=j+1;image4(j)=1;endenddata(j)=X(length(X));image4length=length(image4);y=1:1:image4length ;figure;plot(y,image4(y));CR=image2length/image4length;l=1;for m=1:image4lengthfor n=1:1:image4(m);rec_image(l)=data(m);l=l+1;endendu=1:1:length(rec_image);figure;plot(u,rec_image(u));rec2_image=reshape(rec_image,320,240);figure;imshow(rec2_image);% --- Executes on button press in pushbutton4.% --- Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)f=imread('1.jpg');u=rgb2gray(f);F=double(f);U=double(u);[H,W]=size(u);uSobel=u;for i=2:H-1for j=2:W-1Gx=(U(i+1,j-1)+2*U(i+1,j)+F(i+1,j+1))-(U(i-1,j-1)+2*U(i-1,j)+F(i-1,j+ 1));Gy=(U(i-1,j+1)+2*U(i,j+1)+F(i+1,j+1))-(U(i-1,j-1)+2*U(i,j-1)+F(i+1,j-1));uSobel(i,j)=sqrt(Gx^2+Gy^2);endendsubplot(2,2,1);imshow(f);title('原图像');subplot(2,2,4);imshow(im2uint8(uSobel));title('Sobel图像');% --- Executes on button press in pushbutton6.function pushbutton6_Callback(hObject, eventdata, handles)% hObject handle to pushbutton6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)figure;I=imread('1.jpg');I1=rgb2gray(I);subplot(2,2,1);imshow(I1);h1=[1 0;0 -1];B1=imfilter(I1,h1);h2=[0 1;-1 0];B2=imfilter(I1,h2);B3=B1+B2;subplot(2,2,4);imshow(B3);title('Roberts图像');四、实验结果截图五、实验体会借鉴老师的代码写,甚是有趣。
实验一图像变换(验证性)1.实验目的熟悉图像的二维离散余弦变换和反变换;熟悉图像的二维离散傅立叶变换和反变换;2.实验内容图像的二维离散余弦变换和反变换及二维离散傅立叶变换和反变换熟悉下列模块函数:rgb2gray - Convert RGB image or colormap to grayscale.uint8 -Convert to unsigned 8-bit integer.dct2 - Compute 2-D discrete cosine transform.idct2 - Compute 2-D inverse discrete cosine transform.fft2 -Two-dimensional discrete Fourier Transformfftshift - Shift zero-frequency component to center of spectrumifftshift - Inverse fftshiftifft2 - Two-dimensional inverse discrete Fourier transform3.原理傅立叶变换是对线性系统进行分析的一个有力工具,它将图像从空域变换到频域,是我们能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪声、显示点等的作用(效应)。
把傅立叶变换的理论同其物理解释相结合,将有助于解决大多数图像处理问题。
在数字图像处理中,输入图像和输出图像通常都是二维的,一般表示成二维数字矩阵,因此,这里直接讨论二维傅立叶变换、二维DFT、二维FFT。
二维M×N的DFT变换和逆DFT变换分别定义如下∑∑-=-=--=101)/2()/2(),(),(M i N k nk N j mi M j e e k i f n m F ππ其中,m=0,1,…,M-1;n=0,1,…,N-1。
∑∑-=-==1010)/2()/2(),(1),(M m N n nk N j miM j e en m F NMk i f ππ其中,m=0,1,…,M-1;n=0,1,…,N-1。
实验报告实验名称实验二图像压缩课程名称数字图像处理A姓名成绩班级学号日期地点(1)掌握离散余弦变换DCT的实现方法,了解DCT的幅度分布特性,从而加深对DCT 变换的认识;(2)掌握图像DCT变换编码的实现方法,从而加深对变换编码压缩图像原理的理解;(3)使用DCT变换编码编写程序实现图像压缩;2.实验环境(软件条件)Windws2000/XPMATLAB 7.03.实验方法根据如图2.1所示的典型变换编码系统,采用DCT变换对256×256大小、256级灰度的数字图像lena.bmp(如图2.2所示)进行如下处理:图2.1 典型变换编码系统图2.2 实验图像lena.bmp(1)对图像进行8×8分块处理并作DCT变换,观察图像8×8子块的DCT系数的分布,并分析其特点;(2)对DCT系数进行量化及反量化处理,求反量化系数的逆DCT变换,重新显示重建图像、误差图像和误差图像的直方图;(3)将量化步长分别增大为初始值的2倍、4倍、8倍后再进行DCT变换编码,显示不同量化步长条件下的重建图像、误差图像以及误差图像的直方图。
分析重建图像质量和量化步长的关系。
结果图原图像经dct 变化的图像对经DCT 变化后的图像进行量化反量化的图像050100150200250200040006000原图像经dct 变化的图像对经DCT 变化后的图像进行量化反量化的图像05010015020025020004000原图像经dct 变化的图像对经DCT 变化后的图像进行量化反量化的图像05010015020025020004000原图像经dct 变化的图像对经DCT 变化后的图像进行量化反量化的图像050100150200250200040005.实验结论结果图离散余弦变换的变换核为余弦函数。
余弦变换除了具有一般的正交变换性质外,它的变换矩阵的基向量能较好的描述图像信号和人类语音信号的相关特征,因此被应用与图像压缩编码的语音信号处理等领域。
数字图像处理上机实验指导书童立靖北方工业大学计算机学院tong_lijing@北 方 工 业 大 学2015-6-12 第2页/共9页实验四 图像压缩一、实验目的、要求与环境1.1目的:通过实验,了解数字图象压缩的一般方法,掌握图像压缩的编程方法,了解图象压缩效果的评价方法。
1.2 要求:对自选的图象进行离散余弦变换,将其进行图象压缩处理,自行设计量化矩阵,与编码方法,并计算压缩比,提交实验报告。
进度较快的同学,可以设计三种不同的量化矩阵或编码方法,完成三种不同程度的压缩,对比解压缩后的图像质量,并进行分析。
(给分较高)1.3 环境:Windows XP 操作系统Microsoft Visual C++ 6.0 (SP6)自带8位灰度图像文件:lena-gray.bmp :北方工业大学二、实验步骤1.准备相关图像文件。
2.在XP操作系统上,打开Microsoft Visual C++ 6.0 (SP6),编写相关程序,完成对离散余弦变换系数的量化矩阵设计与编码方法。
4.对程序进行相关调试,修改程序,去除其中的BUG。
5. 利用自己准备的图像的文件,和编写的程序,将给定的图象进行压缩处理。
6.截屏,保留实验结果。
7. 计算压缩比, 进行实验结果分析。
8. 撰写并提交实验报告。
三、注意事项1.实验任务:Windows下完成图像压缩的程序编写。
2.去多模式教学网上下载程序框架:DCT-Quantify8-Frame.rar。
3.图像高度、宽度须是8的倍数。
BMP 格式,8位灰度图像。
4.对于一幅彩色图像,可以在photoshop中,图像=》模式=》灰度=》扔掉文件=》存储为=》保存=》选择8位深度=》确定。
5.实验完成时间:先在课下完成程序编写,然后课上完成验机。
第15周的周一、第15周的周五,二次实验课。
6.请记录实验报告中相应的贴图:可以用屏幕拷贝,然后再用Photoshop中的工具中修剪一下。
7.请每位同学用自己的图像文件进行实验:若2位同学使用的图像文件一样,两位均依抄袭计0分。
2015-6-12 第3页/共9页北方工业大学8.请每位同学自己编写程序:若2位同学编写的程序发现抄袭,两位均计0分。
9.来后请签到。
10.做完后请验机:验机在课内完成,由于同学较多,请大家尽可能提前验机,以免最后大家等待的时间较长。
11.课后完成实验报告。
12.实验报告:若发现2位同学的实验报告抄袭,两位均计0分。
13.实验报告模板:去多模式教学网上下载《42实验报告模板-图像压缩20150128.doc》,然后填入自己的上机相关内容14.实验报告,每位同学在第16周周一,由课代表按学号排序上交,逾期不收(因为一周内课程成绩必须要上报到教务处)。
四、框架程序1.量化表为:double QuantTbl[8][8]={// 0 1 2 3 4 5 6 70, 0, 0, 0, 0, 0, 0, 0, //70, 0, 0, 0, 0, 0, 0, 0, //60, 0, 0, 0, 0, 0, 0, 0, //50, 0, 0, 0, 0, 0, 0, 0, //41, 1, 1, 1, 0, 0, 0, 0, //31, 1, 1, 1, 0, 0, 0, 0, //21, 1, 1, 1, 0, 0, 0, 0, //12, 1, 1, 1, 0, 0, 0, 0 //0 };实验时请根据需要修改量化表。
2.请补充下列程序:目标是:B OOL CBMPEdit::DCTQuantify()把double *pFuvArray(height*width)中的DCT系数(已完成8*8的DCT 2015-6-12 第4页/共9页北方工业大学变换),按照量化表double QuantTbl[8][8]进行量化,到__int8 *pQuantResult(height*width);●B OOL CBMPEdit::DCTWrite()把量化后的系数__int8 *pQuantResult(height*width)有选择的存入文件,使用CFile●B OOL CBMPEdit::IDCTRead()在DCT反变换时,把文件读入内存中的__int8 *pQuantResult(height*width),使用CFile,注意数据位置的控制。
●B OOL CBMPEdit::IDCTQuantify()把内存中的__int8 *pQuantResult(height*width)进行反量化,存入double*pFuvArray(height*width)3.可以分3步完成:1.把double *pFuvArray(height*width)中的DCT系数存入磁盘文件,再把文件读入内存中double *pFuvArray(height*width)。
验证程序正确性。
2.修改量化表数值为非0,进行量化与反量化的过程。
3.修改量化表数值为部分为0,存储时舍弃量化表中为0位置的频谱数据,进行压缩编码存储。
4.CFile文件类的使用:向文件写入数据示例:CFile QuantFile("quantify.txt",CFile::modeCreate|CFile::modeReadWrite );QuantFile.Write( pQuantResult , n);QuantFile.Close();从文件读取数据示例:CFile QuantFile("quantify.txt",CFile::modeReadWrite );QuantFile.Read(pQuantResult , n);QuantFile.Close();sprintf(oneline,"%d, %d, %10d, %10lf, %10lf\r\n",u,v,p,r,Q);2015-6-12 第5页/共9页北方工业大学5.各编写函数的功能BOOL CBMPEdit::DCTQuantify(){int height = m_BmpInfo.bmiHeader.biHeight;int width = m_BmpInfo.bmiHeader.biWidth;pQuantResult = new __int8[height*width];//add your code here//对DCT 系数进行量化//对DCT的系数pFuvArray[]进行量化//即对pFuvArray[]中的数据除以量化表QuantTbl[][],//需要考虑量化表8*8的位置对应,以及量化表中为0数据的量化处理//量化结果放入量化结果缓冲区pQuantResult[]return TRUE;}BOOL CBMPEdit::DCTWrite(){//add your code here//把量化后的系数写入文件。
//可有所选择//把量化后的数据pQuantResult[]写入文件//对于量化表QuantTbl[][]中为0的数据的对应位置,无需存储。
//向文件写入数据示例://CFile QuantFile("quantify.txt",CFile::modeCreate|CFile::modeReadWrite );//QuantFile.Write( pQuantResult , n);//QuantFile.Close();return TRUE;}BOOL CBMPEdit::IDCTRead(){//add your code here//把写入系数的文件读入内存//把文件中的数据读入量化结果缓冲区pQuantResult[]2015-6-12 第6页/共9页北方工业大学//对于量化表QuantTbl[][]中为0数据所对应的位置,补入0。
//从文件读取数据示例://CFile QuantFile("quantify.txt",CFile::modeReadWrite );//QuantFile.Read(pQuantResult , n);//QuantFile.Close();return TRUE;}BOOL CBMPEdit::IDCTQuantify(){//add your code here//对量化后的系数进行反量化处理//对文件读入的数据pQuantResult[]进行反量化//即对pQuantResult[]中的数据乘以量化表QuantTbl[][]//需要考虑量化表8*8的位置对应。
//反量化结果放入pFuvArray[]中return TRUE;}可根据需要自行调整设计。
6.关键数据结构的说明*pImageData:图像原始数据缓冲区指针。
*pData:图像显示缓冲区指针。
*pDCTResultD:图像DCT变换后用于显示的数据缓冲区指针。
*pIDCTResult:对DCT变换结果进行IDCT变换的结果数据缓冲区指针。
HGLOBAL m_hgImageData; //图像数据句柄HGLOBAL m_DCTResultD; //DCT变换结果显示缓冲区句柄HGLOBAL m_IDCTResult; //IDCT反变换结果缓冲区句柄HGLOBAL m_Error; //IDCT反变换结果-原图句柄double *pFuvArray; //DCT变换结果缓冲区double *pImage8; //8*8变换图像缓冲区double *pFuv8; //8*8变换频谱缓冲区2015-6-12 第7页/共9页北方工业大学__int8 *pQuantResult; //DCT 量化结果7.菜单DCT变换的接口void CMy02testView::OnDCTTransform(){// TODO: Add your command handler code hereCMy02testDoc* pDoc = GetDocument();pDoc->m_BMP.DCTTransform();pDoc->m_BMP.DCTQuantify();pDoc->m_BMP.DCTWrite();pDoc->m_BMP.PlayBmpDCT(m_pMemDC,CPoint(0,0));Invalidate(FALSE);}8.菜单DCT反变换的接口void CMy02testView::OnIDCTTransform(){// TODO: Add your command handler code hereCMy02testDoc* pDoc = GetDocument();pDoc->m_BMP.IDCTRead();pDoc->m_BMP.IDCTQuantify();pDoc->m_BMP.IDCTTransform();pDoc->m_BMP.PlayBmpIDCT(m_pMemDC,CPoint(0,0));Invalidate(FALSE);}9.菜单残差的接口void CMy02testView::OnError(){// TODO: Add your command handler code hereCMy02testDoc* pDoc = GetDocument();pDoc->m_BMP.Error();pDoc->m_BMP.PlayBmpError(m_pMemDC,CPoint(0,0));2015-6-12 第8页/共9页北方工业大学Invalidate(FALSE);}10.相关函数说明主要功能函数:BOOL CBMPEdit::LoadBmpFile(const CString &sBmpFileName) 主要功能:读入BMP文件。