MATLAB课程设计报告.docx
- 文档编号:5053281
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:36
- 大小:596.94KB
MATLAB课程设计报告.docx
《MATLAB课程设计报告.docx》由会员分享,可在线阅读,更多相关《MATLAB课程设计报告.docx(36页珍藏版)》请在冰豆网上搜索。
MATLAB课程设计报告
《基于MATLAB的图像处理》
课程设计
functionslider2_Callback(hObject,eventdata,handles)
%hObjecthandletoslider2(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Hints:
get(hObject,'Value')returnspositionofslider
%get(hObject,'Min')andget(hObject,'Max')todeterminerangeofslider
globalIsl
I=imread('pout.tif');
sl=get(handles.slider2,'value');
axes(handles.axes1);
axison;
boxon;
im2bw(I,sl);
%---Executesduringobjectcreation,aftersettingallproperties.
functionslider2_CreateFcn(hObject,eventdata,handles)
%hObjecthandletoslider2(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled
%Hint:
slidercontrolsusuallyhavealightgraybackground.
ifisequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9.9.9]);
end
%---Executesonbuttonpressinpushbutton1.
学生姓名:
徐清福
学号:
110700136
专业班级:
信通一班
指导教师:
郑晓明
二○一零年4月8日
目录(二号字体)
一.课程设计目的…………………………………………………2
二.课程设计要求…………………………………………………2
三.课程设计报告内容……………………………………………2
四.程序需求和模块分析…………………………………………2
五.详细设计过程…………………………………………………3
六.调试及分析……………………………………………………16
七.心得体会………………………………………………………17
八.附录……………………………………………………………18
九.参考文献………………………………………………………34
课程设计的内容如下:
一.课程设计目的
综合运用MATLAB工具箱实现图像处理的GUI程序设计。
二.课程设计题目描述和要求
1)熟悉和掌握MATLAB程序设计方法
2)掌握MATLABGUI程序设计
3)学习和熟悉MATLAB图像处理工具箱
4)学会运用MATLAB工具箱对图像进行处理和分析
三.课程设计报告内容
学习MATLABGUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop。
要求:
按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。
然后按照自己拟定的功能要求进行程序设计和调试。
1)图像的读取和保存。
2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。
3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。
4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。
5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。
6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。
比较去噪效果。
四.程序需求和功能模块分析
在设计过程中出满足了一般的数字图像处理功能。
例如读取图像、保存图像、图像的旋转变换、加噪声去噪声、彩色图像直方图统计、频谱分析、灰度图像处理和彩色图像的颜色转换模型等基本功能。
本设计还加入了边沿检测和用滑动条控制图像的亮度和gamma值等功能。
在菜单栏中还加入了快捷键功能。
由于作者的水平有限,实现的功能不是很多,而且都是一般的功能;
(1)、将一个RGB图像转换为灰度图像。
(2)、可以对图像做各种变换,如旋转等。
(3)、有时并不需要图像显示其细节部分,只要其轮廓,这时候不要很高的灰度级。
可以把图像转换为二值图像,进行图像腐蚀,或是创建索引图像等。
(4)、分析一个图像的频谱特征,利用傅里叶变换,将图像从空间域变换到频域,然后进行各种处理,经过高通滤波器或是低通滤波器。
(5)、为了科学地定量描述和使用颜色,人们提出了各种颜色模型,按用途可分为三类:
计算颜色模型,视觉颜色模型和工业颜色模型。
有时为了不同的需要,要对颜色模型进行转换。
设计完成后的基本效果图如下:
五.详细设计过程
5.1图像的读取、保存和退出
打开:
为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件,设计为可以读取任何格式的图像。
Uigetfile函数的调用格式为[name,path]=yigetfile(…),在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“name”和“path”中。
如果按下取消按钮或是发生错误,则返回值是0。
根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.img。
执行效果如下:
如果没有选中任何文件则弹出错误对话框:
保存图像
同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite函数,把数据i存到指定的文件。
执行后效果图如下:
如果没有保存弹出错误对话框:
退出
程序如下所示:
clc;
closeall;
close(gcf);
5.2图像的编辑:
灰度
实现RGB图像转换成为灰度图像,如果本来就是灰度图像则不能转化,弹出错误对话框。
由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示灰度图像,把三维图像降为二维,可以只取其中的二维数据,实现方法程序为:
y=(handles.img(:
:
1));
imshow(y);
但是这样的话,根据程序所选的不同,图像数据也不同,显示也就不一样。
另一种方法就是,运用rgb2gray函数实现彩色图像到灰度图像的转换。
程序为:
y=rgb2gray(handles.img);
imshow(y);
这个程序只能用于RGB图像转换灰度图像,当原始图像本来就是灰度图像时,运行该程序时就会出错,但是使用者在使用时有时并不知道这些,为了使该程序更加完善,应该在使用者原先图像时灰度图像时使用该功能时,应该要显示提示类信息。
执行效果如下:
如果读入的是灰度图像,则弹出错误对话框:
亮度和gamma值调整
用imadjust函数,其调用格式如下:
g=imadust(f,[low_inhigh_in],[low_outhigh_out]),gamma)
gamma表示映射性质,默认值是1表示线性映射。
由于该函数有五个参数需要输入,为了方便用户改变,所以这里设计一个输入对话框,用户通过对话框把五个参数赋值给[low_inhigh_in],[low_outhigh_out],gamma这五个参数,如下一组命令建立了如图所示的输入对话框:
prompt={'inputparameter1',''inputparameter2','inputgamma'};
defans={'[00.7]','[01]','1'};
p=inputdlg(prompt,'inputparameter',1,defans);
但是,这种方法并不能很好的让用户能够对图像进行任意的亮度和对比度变化调整,有时并不事先知道参数的值要多少,也不关心,而是任意调节的,直到满意为止。
所以应该用滑动条来调节图像的亮度和对比度,这样更适合用户的使用习惯。
由于imadjust函数有五个参数,所以原则上需要设计五个滑动条来调节对比度,这对用户来说显然比较麻烦,因此在设计的时候固定其中的三个参数,通过调节两个参数的值来改变亮度和对比度。
[0handles.beta],[01],handles.gm,这里的变量handles.beta和handles.gm就通过滑动条得到,滑动条设计如下图:
亮度调整的tag名为ld,取值范围0~1,gamma值的tag名为gamma,取值范围为0~5。
获取滑动条参数的程序如下:
handles.beta=get(handles.ld,'value');
handles.gm=get(handles.gamma,'value');
执行该操作,调节滑动条到上图所示位置,结果如下图
截图
在MATLAB中,用函数imcrop实现对图像的剪切操作。
该操作剪切的是图像中的一个矩形子图,用户可以通过参数指定这个矩形四个顶点的坐标,也可以交互地用鼠标选取这个矩形。
Imcrop函数的调用格式如下:
y=imcrop(handles.img);
不管handles.img是三维的还是二维数据,该函数都能进行操作。
下图就是对图像的截图:
缩放功能
在MATLAB中,用函数imresize来实现对图像的放大或缩小。
插值方法可选用三种方法,最近邻插值,双线性插值,双三次插值。
该函数的调用格式如下:
B=imresize(A,m,method)
其中:
参数method用于指定插值的方法,可选的值为“nearest”(最近邻法),“bilinear”(双线性插值)、“bicubic”(双三次插值),缺省值为“nearest”。
B=imresizee(A.m,method)表示返回原图A的m倍放大图像(m小于1时实际上是缩小);
放大后的效果图不是很明显,但是缩小后的效果就比较明显了:
5.3旋转功能
上下旋转:
函数flipud是实现一个二维矩阵的上下翻转,如
a=[12;34],经过该函数处理后,原矩阵变为[34;12];所以利用该函数也可以对图像进行上下翻转处理,但由于该函数针对二维数据的处理,所以在写程序时,要
对RGB图像和灰度图像分开处理,这就要用到isrgb函数来判断,如果是灰度图像,则可以直接用这个函数进行处理,否则就要对RGB图像进行降维处理,
fork=1:
3
y(:
:
k)=flipud(x(:
:
k));
end
执行后的效果如上图所示。
左右旋转
对图像的左右翻转也可以用fliplr函数来处理,同样的,也要对灰度和彩色图像分开处理,处理结果如图:
任意角度的旋转
5.4加入和去除噪声
经常用到的噪声有三种,高斯噪声,椒盐噪声,乘性噪声,可以通过以下三个函数来实现:
y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声
y=imnoise(x,'salt&pepper',p1);%椒盐噪声
y=imnoise(handles.img,'speckle',p1);%乘性噪声
p1,p2的参数也通过输入对话框的形式得到,原图加入高斯噪声后结果如下所示:
5.5直方图统计
用imhist函数对图像数据进行直方图统计,
x=imhist(handles.img(:
:
1));
bar(horz,x);
其中,x矩阵的数据是0~255灰度值的统计个数,如果直接对x矩阵数据进行图形图显示,由于有256个数据,在坐标系中就会很密集,为了更清楚的显示条形图,所以在程序设计时,把x数据进行部分提取,
x1=x(1:
10:
256);
horz=1:
10:
256;
bar(horz,x1);
除了显示数据的直方图统计外,还可以对图像进行均衡处理,所用到的函数是histeq,这两个函数同样只使用于二维数据,所以也要对二维和三维数据分开处理。
R直方图显示如下图所示:
均衡后的图像如下图所示:
5.6频谱分析:
频谱图
为了得到图像的频谱图,先要对数据进行傅里叶变换,用fft2函数对二维数据进行快速傅里叶变换,同时为了更好的观察频谱图,需要把fft2变换后的数据进行平移,利用fftshift函数,把快速傅里叶变换的DC组件移到光谱中心。
这样图像能量的低频成分将集中到频谱中心,图像上的边缘、线条细节信息等高频成分将分散在图像频谱的边缘。
如下图所示:
高通滤波器
axes(handles.axes2);
x=(handles.img);
ifisrgb(x)
msgbox('thisisacolorimage,cannotconvert','error');
else
y1=imnoise(x,'gaussian');%加高斯噪声
f=double(y1);%数据类型转换
k=fft2(f);%傅立叶变换
g=fftshift(k);%转换数据矩阵
[M,N]=size(g);
nn=2;
d0=3;%截止频率为3
m=fix(M/2);n=fix(N/2);
fori=1:
M
forj=1:
N
d=sqrt((i-m)^2+(j-n)^2);%计算高通滤波器传递函数
ifd<=d0
h=0;
elseh=1;
end
result(i,j)=h*g(i,j);
end
end
result=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3);
end
低通滤波器
axes(handles.axes2);
x=(handles.img);
ifisrgb(x)
msgbox('thisisacolorimage,cannotconvert','失败');
else
y1=imnoise(x,'salt&pepper');%叠加椒盐噪声
f=double(y1);%数据类型转换,不支持图像的无符号整型的计算
g=fft2(f);%傅立叶变换
g=fftshift(g);%转换数据矩阵
[M,N]=size(g);
nn=2;%二阶巴特沃斯(Butterworth)低通滤波器
d0=10;%截止频率为10
m=fix(M/2);n=fix(N/2);
fori=1:
M
forj=1:
N
d=sqrt((i-m)^2+(j-n)^2);
h=1/(1+0.414*(d/d0)^(2*nn));%计算低通滤波器传递函数
result(i,j)=h*g(i,j);
end
end
result=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3);%显示滤波处理后的图像
end;执行后的效果如下图所示:
5.7灰度图像处理
用j=im2bw(x);来对灰度图像到二值图像的转换
用X=grayslice(I,n)函数实现,转化后得到的图像为:
5.8彩色图像的颜色转化
现列出RGB颜色模型到HSV模型的转换程序:
(其他程序类似,函数不同)
axes(handles.axes2);
x=(handles.img);
ifisrgb(x)
HSV=rgb2hsv(x);
imshow(HSV);
else
msgbox('thisisagrayimage,cannotconvert','error');
end
转换后的结果为:
5.9灰度图像边沿检测
在BUTTONGROUP中添加了四个RADIOBUTTON来实现灰度图像边沿检测的功能。
其中提供了三种边沿检测:
sobel、prewitt、canny边沿检测功能。
例如sobel这部分函数实现边沿检测程序为:
case'sobel'
BW=edge(y,'sobel');
imshow(BW);
执行后效果图:
六.调试以及分析
本次课设所使用的MATLAB是7.0版本的,较以前的版本例如6.5的功能更加强大。
首先打开MATLAB7.0,然后在file菜单中选择新建new中的gui,即可弹出一个新建的figure文件。
在设计好figure文件以后,每次打开都要从gui的openexitinggui中打开,才能进行编辑。
在程序设计过程中遇到了许多问题例如一个函数只能对灰度图像处理,不能对RGB图像处理,那么如何才能对RGB图像处理呢?
了解MATLAB和数字图像处理的人都知道用到的很多函数是针对二维数据的,而RGB图像的数据是一个三维矩阵,所以处理要与灰度图像不同,在开始的时候,我认为应该找一个能够应用于三维矩阵的函数,结果却没找到,后来想到可以把三维数据进行降维处理,同样使用二维的函数,只要是同样处理三次。
比如,彩色图像的滤波处理,直方图均衡等。
再例如同一个操作对灰度图像可以使用,当用户选择的是彩色图像时,该操作就会出错?
这是由于设计程序时,本身程序是有针对性的,有些程序只能对灰度图像有效,有些对彩色图像有效,但是用户并不清楚这些,所以在设计的过程中就要考虑全面,要分开设计。
在本次课程设计中,我均对每个程序的开始时,用ifisrgb(x)进行判断。
等等很多问题都要自己去查阅资料,分析问题并解决问题。
七.心得体会
MATLAB不仅具有强大的数值运算功能,也同样具有非常强大的二维和三维绘图功能,尤其擅长于各种科学运算结果的可视化。
计算的可视化可以将杂乱的数据通过图形表示从中观察出其内在的关系。
MATLAB的图形命令格式简单,可以使用不同的线形、彩色、数据点标记等来修饰图像,也可以设计出图形用户界面,方便地进行人机交互。
由于MATLAB函数众多,而且课本上提供的都是最基本的函数功能,自己不仅要去图书馆借这方面的专业书籍来阅读。
而且许多函数的编写都要用到C语言,对C语言也有一定得要求。
例如边缘检测函数的实现,在建立了BUTTONGROUP之后,添加RADIOBUTTON按钮,然后右键调用SelectionChangeFcn,弹出M文件,在相应的地方编写。
由于其中包含了四个子功能,实现的时候要用到SWITCH函数。
globaly
str=get(hObject,'string');
axes(handles.axes2);
switchstr
case'原图'
imshow(y);
case'sobel'
BW=edge(y,'sobel');
imshow(BW);
case'prewitt'
BW=edge(y,'prewitt');
imshow(BW);
case'canny'
BW=edge(y,'canny');
imshow(BW);
end;
由于不同版本的MATLAB可能不兼容,特别是高版本的在低版本的MATLAB中几乎打不开,而只是一堆乱码。
所以我想能不能把figure文件转换成可执行文件exe。
在查阅了相关资料后发现可以转换。
在打开可执行文件时虽然不比安装MATLAB,但是需要安装相应的补丁来支持底层文件才能执行。
通过本次课程设计,使自己对MATLABGUI设计流程有了比较深刻的体会,同时也了解了一般软件设计的过程。
在设计过程中碰到了很多的问题,通过这些问题,使自己分析问题,解决问题的能力得到了较大的提高。
八.附录
文件菜单栏:
--------------------------------------------------------------------
functionopen_Callback(hObject,eventdata,handles)
%hObjecthandletoopen(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
globaly
[name,path]=uigetfile({'*.*'},'Loadingofimage');
ifisequal(name,0)|isequal(path,0)
errordlg('nofileselected','error')
return;
else
y=imread([path,name]);
axes(handles.axes1);
imshow(y);
handles.img=y;
handles.noise_img=y;
guidata(hObject,handles)
end
--------------------------------------------------------------------
functionsave_Callback(hObject,eventdata,handles)
%hObjecthandletosave(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
[filename,pathname]=uiputfile('*.bmp','saveas');
ifisequal([filename,pathname],[0,0])
errordlg('nofilesaved','error');
return;
else
file=strcat(pathname,filename);
(handles.axes2);
i=getimage(gca);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)