实验二
MATLAB入门
设计题目:
1.基本题:MATLAB的基本运算和绘图
2.综合题:绘制2维高斯函数的3-D图形
设计要求:
1.基本题:
1) 在同一幅图上创建 和 两条曲线图。
2) 曲线f用红色;曲线g用蓝色。
3) 在区间[0,1]用等间距的30个数据点。
4) 曲线f上的取值点用红色的“*”表示;曲线g上的取值点用蓝色的“o”表示。
5) 用楷体GB2312字标注:
水平轴标注为“时间”,垂直轴标注为“幅度”,字号均为18磅。
图题标注为“MATLAB入门/姓名,日期”,字号为24磅。
6) 用图例标注语句legend给曲线加说明。
2.综合题:
1) 绘制二维高斯函数 的3维线性图、网眼图和表面图,并对它们分别加图题和标注坐标轴。
2) 绘制
的三维线形图、网眼图、表面图和混合图,并加图题。
X的范围[-2,2],y的范围[-2,2],以0.05为间隔。
预期目标:
A. 通过基本题,学习Matlab的基本使用方法,包括基本的数学运算,图形绘制等。
B. 通过综合题,学会绘制三维图形的基本方法,巩固数学预算的表示方法。此外,因为高斯函数在图像滤波中是一个基本函数,通过综合题还可进一步熟悉高斯函数的特性。
3.报告要求:提交源程序和绘制的图形
程序一
x=0:1/30:1;
y1=1./(1+x.*x);
y2=exp(x.*x.*x);
plot(x,y1,'r*',x,y2,'bo');
title('MATLAB入门,2011-11-28','Fontsize',24,'FontName','楷体');
xlabel('时间','Fontsize',18,'FontName','楷体');
ylabel('幅度','Fontsize',18,'FontName','楷体');
legend('y1=1./(1+x.*x)','y2=exp(x.*x.*x)');
程序二
clear;x=-2:0.05:2;
y=-2:0.05:2;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=(X.*X+Y.*Y)./2+eps;
Z=(1/2*pi).*exp(-R);
plot3(X,Y,Z);
title('三维线形图,2011-11-28','Fontsize',24,'FontName','楷体');
xlabel('x','Fontsize',18,'FontName','楷体');
ylabel('y','Fontsize',18,'FontName','楷体');
zlabel('z','Fontsize',18,'FontName','楷体');
legend('f=(1/2*pi).*exp(-(x^2+y^2)/2)');
程序三
clear;x=-2:0.05:2;
y=-2:0.05:2;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=(X.*X+Y.*Y)+eps;
Z=(1/2*pi).*exp(-R./2);
mesh(Z);
colormap(hot)
title('网眼图,2011-11-28','Fontsize',24,'FontName','楷体');
程序四
clear;x=-2:0.05:2;
y=-2:0.05:2;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=(X.*X+Y.*Y)+eps;
Z=(1/2*pi).*exp(-R);
surf(Z);
colormap(hot)
title('表面图,2011-11-28','Fontsize',24,'FontName','楷体');
xlabel('x','Fontsize',18,'FontName','楷体');
ylabel('y','Fontsize',18,'FontName','楷体');
zlabel('z','Fontsize',18,'FontName','楷体');
legend('f=(1/2*pi).*exp(-(x^2+y^2)/2)');
程序五
clear;x=-2:0.05:2;
y=-2:0.05:2;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=-(X.*X+Y.*Y);
Z=4*X.*exp(R);
plot3(X,Y,Z);
title('三维线形图2,2011-11-28','Fontsize',24,'FontName','楷体');
xlabel('x','Fontsize',18,'FontName','楷体');
ylabel('y','Fontsize',18,'FontName','楷体');
zlabel('z','Fontsize',18,'FontName','楷体');
legend('f=4.*x.*exp(-(x^2+y^2))');
程序六
clear;x=-2:0.05:2;
y=-2:0.05:2;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=-(X.*X+Y.*Y);
Z=4*X.*exp(R);
mesh(Z);
title('网眼图2,2011-11-28','Fontsize',24,'FontName','楷体');
legend('f=4.*x.*exp(-(x^2+y^2))');
程序七
clear;x=-2:0.05:2;
y=-2:0.05:2;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=-(X.*X+Y.*Y);
Z=4*X.*exp(R);
surf(X,Y,Z);
title('表面图2,2011-11-28','Fontsize',24,'FontName','楷体');
legend('f=4.*x.*exp(-(x^2+y^2))');
程序八
clear;x=-2:0.05:2;
y=-2:0.05:2;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=-(X.*X+Y.*Y);
Z=4*X.*exp(R);
surfc(X,Y,Z);
title('混合图,2011-11-28','Fontsize',24,'FontName','楷体');
legend('f=4.*x.*exp(-(x^2+y^2))');
实验报告三:基于DCT的数字图像压缩及Matlab实现
一、 实验目的
掌握基于DCT变换的图像压缩的基本原理及其实现步骤;通过使用MATLAB,对同一幅原始图像进行压缩,进一步掌握DCT和图像压缩。
二、 实验原理
(一)图像压缩基本原理
图像数据压缩的目的是在满足一定图像质量的条件下,用尽可能少的比特数来表示原始图像,以提高图像传输的效率和减少图像存储的容量,在信息论中称为信源编码。
在图像压缩中,压缩比是一个重要的衡量指标。可以定义压缩比为:
(二)图像压缩的基本模型
图像编码包括两个阶段,前一个阶段就是利用预测模型或正交模型对图像信号进行变换;后一个阶段是利用已变换信号的统计特性,对其分配适当的代码来进行编码传输。
JPEG图像格式的压缩算法采用的是DCT。
1) DCT的定义
DCT变换利用傅立叶变换的性质,采用图像边界褶翻将图像变换为偶函数形式,然后对图像进行二维傅立叶变换,变换后仅包含余弦项,所以称之为离散余弦变换。
2) DCT和图像压缩
DCT编码属于正交变换编码方式,用于去除图像数据的空间冗余。DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。而图像的能量通常集中在低频部分。
三、 实验内容
离散余弦变换的Matlab实现
利用余弦变换进行图像压缩,首先要将输入图像分解成8×8或16×16的块,然后对每个块进行二维离散余弦变换,最后将变换得到的量化DCT系数进行编码和传送,形成压缩后的图像格式。解码时对每个块进行二维DCT反变换,最后在将反变换后的块组合成一副图像。
对于通常的图像来说,大多数的DCT系数的值非常接近于0。如果舍弃这些接近于0的值,在重构图像时并不会带来图像画面质量的显著下降。所以,利用DCT进行图像压缩可以节约大量的存储空间。压缩应该在最合理的近似原图像的情况下使用最少的系数,使用系数的多少也决定了压缩比的大小。
按照以上的方法,使用MATLAB,将一幅图像分成8×8的块使用二维离散余弦变换进行压缩(压缩比为16:1,8:1),给出实验仿真结果,要求显示压缩前后的图像,并且计算压缩前后图像的均方误差MSE。改变压缩比为8:1,再如前所做,比较不同之处。
四、 实验源程序
I=imread('D:\我的文件\U盘文件\大学课件\多媒体实验讲义\picture\LENA.TIF');
I=im2double(I);%图像存储类型转换
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%对原图像进行DCT变换
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
%进行DCT反变换,得到压缩后的图像
subplot(2,2,1);
imshow(I)
title('压缩前的图像')
subplot(2,2,2);
imshow(I2)
title('压缩后的图像')
InitialImage=imread('D:\我的文件\U盘文件\大学课件\多媒体实验讲义\picture\LENA.TIF');
rat=1./8;%设置压缩比
InitialImage=double(InitialImage)/255;%设置系数保留个数
T=dctmtx(8);
DCTCoe=blkproc(InitialImage,[8 8],'P1*x*P2',T,T');%计算离散余弦变换
分块处理
CoeVar=im2col(DCTCoe,[8 8],'distinct');
Coe=CoeVar;%得到DCT系数矩阵
[Y,Ind]=sort(CoeVar);
[m,n]=size(CoeVar);%求出DCT系数矩阵的大小
Snum=64-64*rat;%按照压缩比保留系数
for i=1:n
Coe(Ind(1:Snum),i)=0;
end
B2=col2im(Coe,[8 8],[256 256],'distinct');%重新排列系数块
I2=blkproc(B2,[8 8],'P1*x*P2',T', T);%进行反余弦变换
subplot(2,2,3);
imshow(I2)
title('压缩比8:1')
% 计算归一化图像的均方误差
error=InitialImage.^2-I2.^2;%计算归一化图象的均方误差
MSE=sum(error(:))/prod(size(I2))
I=imread('D:\我的文件\U盘文件\大学课件\多媒体实验讲义\picture\LENA.TIF');
I=im2double(I); %图像存储类型转换
T=dctmtx(16); %离散余弦变换矩阵
B=blkproc(I,[16 16],'P1*x*P2',T,T'); %对原图像进行DCT变换
mask=[1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
B2=blkproc(B,[16 16],'P1.*x',mask); %数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[16 16],'P1*x*P2',T',T); %进行DCT反变换,得到压缩后的图像
InitialImage=imread('D:\我的文件\U盘文件\大学课件\多媒体实验讲义\picture\LENA.TIF');
InitialImage=double(InitialImage)/255;
T=dctmtx(16);
DCTCoe=blkproc(InitialImage,[16 16],'P1*x*P2',T,T');
CoeVar=im2col(DCTCoe,[16 16],'distinct');
Coe=CoeVar;
[Y,Ind]=sort(CoeVar);
[m,n]=size(CoeVar);
Snum=64-32;
for i=1:n
Coe(Ind(1:Snum),i)=0;
end
B2=col2im(Coe,[16 16],[256 256],'distinct');
I2=blkproc(B2,[16 16],'P1*x*P2',T', T);
subplot(2,2,4);
imshow(I2);
title('压缩比16:1');
error=InitialImage.^2-I2.^2;
MSE=sum(error(:))/prod(size(I2))
注意图像路径,直接运行程序,图像自动生成
实验四
图像增强和滤波实验
一、
实验目的
掌握基本的图像增强方法,观察图像增强的效果,加深对灰度直方图的理解。掌握基本的图像滤波方法,观察图像滤波的效果。
二、
实验内容
对比度增强,灰度变换,直方图均衡化,图像滤波
对给定的灰度的数字图像(图像文件名分别为cameraman.tif,rice.tif和pout.tif)进行如下处理:
(1)统计原图像的灰度直方图,并利用直方图均衡化处理进行图像增强,
同屏显示处理前后图像及其灰度直方图,比较异同,并回答数字图像均衡化后其直方图分布情况。
(2)利用图像调整函数(直接灰度调整方法)进行图像增强,同屏显示处理前后图像及其灰度直方图,比较异同,并回答数字图像均衡化后其直方图分布情况。
(3)利用函数IMNOISE,在图像(LENA256.BMP)上分别叠加高斯噪声(gaussian)和椒盐噪声(salt&peppers),对比高斯低通滤波器和均值滤波器的性能。
对上述实验内容,自己创造性地设计实验,得出有意义的结论。
三、
实验源程序(1)
I=imread('cameraman.tif');
subplot(221);
imshow(I);
title('(a) 原始图像','Fontsize',12,'Fontname','隶书','color','k');
subplot(222);
imhist(I);title('(b)
原始直方图','Fontsize',12,'Fontname','隶书','color','k');
subplot(223);
H=histeq(I);
imshow(H);title('(c)
均衡化后的图像','Fontsize',12,'Fontname','隶书','color','k');
subplot(224);
imhist(H);title('(d)
均衡化后的直方图','Fontsize',12,'Fontname','隶书','color','k');
结果分析:
直方图也叫柱状图,它的横轴表示亮度等级,将照片的亮度等级分为(0-255)256级,而纵轴则表示每个亮度等级下的像素个数,将纵轴上的这些像素数值点连起来,就形成了连续的直方图波形。由图可知,图像直方图均衡化和局部均衡化,可使图像灰度级均衡平坦。
实验源程序(2)
I=im2double(imread('cameraman.tif'));
J=imnoise(I,'salt & pepper', 0.08);
subplot(2,2,1);
imshow(I);
title('(a)原始图像','Fontsize',12,'Fontname','隶书','color','k');
subplot(2,2,2);
imshow(J);
title('(b)叠加椒盐噪声图','Fontsize',12,'Fontname','隶书','color','k');
H=fspecial('gaussian',10,10);
Y=imfilter(J,H);
subplot(2,2,3);
imshow(Y);
title('(c)高斯滤波器去噪图像','Fontsize',12,'Fontname','隶书','color','k');
M=fspecial('average');
N=imfilter(J,M);
subplot(2,2,4);
imshow(N);
title('(d)均衡滤波器去噪图像','Fontsize',12,'Fontname','隶书','color','k');
实验源程序(3)
I=im2double(imread('cameraman.tif'));
J=imnoise(I,'gaussian', 0.08);
subplot(2,2,1);
imshow(I);
title('(a)原始图像','Fontsize',12,'Fontname','隶书','color','k');
subplot(2,2,2);
imshow(J);
title('(b)叠加高斯噪声图','Fontsize',12,'Fontname','隶书','color','k');
H=fspecial('gaussian',10,10);
Y=imfilter(J,H);
subplot(2,2,3);
imshow(Y);
title('(c)高斯滤波器去噪图像','Fontsize',12,'Fontname','隶书','color','k');
M=fspecial('average');
N=imfilter(J,M);
subplot(2,2,4);
imshow(N);
title('(d)均衡滤波器去噪图像','Fontsize',12,'Fontname','隶书','color','k');
以上程序结果均自行生成,但需注意图像格式和路径
结果分析:
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。对于图像处理来说,常用二维零均值离散高斯函数作平滑滤波器,滤波后的图像平滑但存在严重失真。均值滤波是对信号进行局部平均, 以平均值来代表该像素点的灰度值,但是无法去掉噪声,只能微弱的减弱它。均衡滤波的线性平滑度较差,但图像失真较之高斯滤波要好。
实验五
图像的傅立叶变换和边缘提取
第一部分
图像的傅立叶变换
一、
实验目的
1.了解图像变换的意义和手段;
2. 熟悉傅里叶变换的基本性质;
3. 熟练掌握FFT的方法及应用;
4. 通过实验了解二维频谱的分布特点;
5. 通过本实验掌握利用MATLAB编程实现数字图像的傅立叶变换;
二、
实验内容
1) 应用傅立叶变换进行图像处理
傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。
2) 傅立叶(Fourier)变换的定义
对于二维信号,二维Fourier变换定义为:
二维离散傅立叶变换为:
三、
实验步骤
1.打开计算机,安装和启动MATLAB程序;程序组中“work”文件夹中应有待处理的图像文件;
2.利用MatLab工具箱中的函数编制FFT频谱显示的函数;
3. a)调入、显示三张不同的图像;
b)对这三幅图像做FFT并利用自编的函数显示其频谱;
c)讨论不同的图像内容与FFT频谱之间的对应关系。
4.记录和整理实验报告。
四、
实验源程序:
I=imread('cameraman.tif'); %读入原图像文件
subplot(2,3,1);
imshow(I);
title('原图像1')%显示原图像
fftI=fft2(I); %二维离散傅立叶变换
sfftI=fftshift(fftI); %直流分量移到频谱中心
RR=real(sfftI); %取傅立叶变换的实部
II=imag(sfftI); %取傅立叶变换的虚部
A=sqrt(RR.^2+II.^2);%计算频谱幅值
A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225;%归一化
subplot(2,3,4);
imshow(A);
title('对应频谱1')
I=imread('pout.tif'); %读入原图像文件
subplot(2,3,3);
imshow(I);
title('原图像3')%显示原图像
fftI=fft2(I); %二维离散傅立叶变换
sfftI=fftshift(fftI); %直流分量移到频谱中心
RR=real(sfftI); %取傅立叶变换的实部
II=imag(sfftI); %取傅立叶变换的虚部
A=sqrt(RR.^2+II.^2);%计算频谱幅值
A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225;%归一化
subplot(2,3,6);
imshow(A);
title('对应频谱3')
I=imread('rice.png'); %读入原图像文件
subplot(2,3,2);
imshow(I);
title('原图像2')%显示原图像
fftI=fft2(I); %二维离散傅立叶变换
sfftI=fftshift(fftI); %直流分量移到频谱中心
RR=real(sfftI); %取傅立叶变换的实部
II=imag(sfftI); %取傅立叶变换的虚部
A=sqrt(RR.^2+II.^2);%计算频谱幅值
A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225;%归一化
subplot(2,3,5);
imshow(A);
title('对应频谱2')
实验思考题:
1.傅里叶变换有哪些重要的性质?
答:傅里叶变换建立了信号的时域与频域间的一般关系。傅里叶变换性质有线性性质、对偶性、尺度变换、微分、移位等。
2.图像的二维频谱在显示和处理时应注意什么?
在使用MATLAB工具箱时,一定要注意函数所要求的参数类型,在编程时需注意值域转换。
第二部分
图像边缘提取
一、
实验目的
掌握图像边缘提取的常用算子的特点和程序实现。
二、
实验原理:
物体的边缘以图像局部特性的不连续性的形式出现的,例如,灰度值的突变,颜色的突变,纹理结构的突变等。由于边缘的灰度不连续性,可以使用求导数的方法检测到。最早的边缘检测方法都是基于像素的数值导数的运算。现在使用的边缘检测算法大致可以归纳为两类:梯度(gradient)算子和拉普拉斯(Laplacian)算子。
三、
实验内容:
编制一个通用的边缘提取函数。通过输入不同的参数,能够实现Sobel算子、Prewitt算子、Roberts算子、Laplace算子和Canny边缘检测,并比较不同算子处理后的边缘图像的特点。(图像任选)
四、
实验源程序:
I=imread('rice.png');
subplot(1,3,1);
imshow(I);
title('原图');
J=edge(I,'canny');
subplot(1,3,2);
imshow(J);
title('canny算子边缘提取');
K=edge(I,'Prewitt');
subplot(1,3,3);
imshow(K);
title('Prewitt算子边缘检测');
实验思考题:
如何理解图像的边缘?常用的边缘检测算法有哪些?
答:边缘就是图像中包含的对象的边界所对应的位置。早期的算法有边缘算子法、曲线拟合法、模板匹配法、门限化法。近年来又有许多新的边缘检测的算法:小波变换、小波包的边缘检测等,基于数学形态学、模糊理论和神经网络的边缘检测算法等。