MATLAB图像处理界面设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第1章绪论 (2)
1.1 课题研究目的及意义 (2)
1.2 课题分析 (2)
1.3 MATLAB基本知识介绍 (2)
1.3.1 MATLAB的概述 (2)
1.3.2 MATLAB主要功能 (3)
1.3.3 MATLAB语言的特点 (3)
1.3.4 MATLAB在图像处理中的应用 (4)
2.1 设计思路 (6)
2.2 整体界面 (6)
第3章具体设计与功能的实现 (8)
3.1 文件 (8)
3.1.1 打开 (8)
3.1.2 保存 (9)
3.1.3 退出 (10)
3.2 编辑 (10)
3.2.1 图片的缩放 (10)
3.2.2 图片的翻转 (12)
3.3 图像 (14)
3.3.1 灰度 (14)
3.3.2 调整 (15)
3.4 快捷操作 (17)
3.4.1 还原 (18)
3.4.2 旋转 (18)
3.4.3 裁剪 (19)
3.4.4 撤销 (20)
3.5 噪声 (20)
3.6 滤除噪声 (22)
3.7 频谱分析 (24)
3.7.1 巴特沃斯低通滤波器 (24)
3.7.2 高斯高通滤波器 (25)
3.7.3 频谱图 (26)
3.8 颜色模型转换 (26)
3.9 直方图 (28)
结论 (31)
致谢 (32)
参考文献 (33)
第1章绪论
1.1 课题研究目的及意义
数字图像处理(Digital Image Processing),就是利用数字计算机或者其他数字硬件,对从图像信息转换而得到的电信号进行某些数学运算,以提高图像的实用性。

例如从卫星图片中提取目标物的特征参数,三维立体断层图像的重建等。

总的来说,数字图像处理包括点运算、几何处理、图像增强、图像复原、图像形态学处理、图像编码、图像重建、模式识别等。

应用MATLAB友好的界面和丰富、实用、高效的指令及模块,可以使人较快地认识、理解图像处理的相关概念,逐步掌握图像信号处理的基本方法,进而能够解决相关的工程和科研中的问题。

1.2 课题分析
数字图像处理技术在各个行业得到广泛的应用。

其交互式的图形界面是操作者方便使用这些技术的途径。

本题目将编制一个简易的图形界面读取各种格式的原始图像数据,并对它们自动分析和处理,得到所需要的有用信息,并把相关的信息显示出来,以便于工作人员研究分析。

本文是基于MATLAB图形用户界面进行数字图像处理软件包的设计,详细介绍了图形用户界面的功能及使用方法,所设计软件包中包括图像处理技术的多个方面,并用MATLAB的图像处理工具箱进行了算法的实现。

1.3 MATLAB基本知识介绍
1.3.1 MATLAB的概述
MATLAB 是MATrix LABoratory(“矩阵实验室”)的缩写,是由美国MathWorks 公司开发的集数值计算、符号计算和图形可视化三大基本功能于一体的,功能强大、操作简单的语言。

是国际公认的优秀数学应用软件之一。

MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完相同的事情简捷得多。

MATLAB包括拥有数百个内部函数的主包和三十几种工具包(Toolbox).工具包又可以分为功能性工具包和学科工具包.功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能.学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类.
开放性使MATLAB广受用户欢迎.除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包.
1.3.2 MATLAB主要功能
它是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。

使用它,可以较使用传统的编程语言,如C、C++等,更快的解决技术计算问题。

高级语言可用于技术计算;开发环境可对代码、文件和数据进行管理;数学函数可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等;二维和三维图形函数可用于可视化数据;各种工具可用于构建自定义的图形用户界面;各种函数可将基于matlab的算法与外部应用程序和语言;其应用范围非常广,包括信号和图像处理、通迅、控制系统设计、测试和测量等众多应用领域。

1.3.3 MATLAB语言的特点
一种语言之所以能如此迅速地普及,显示出如此旺盛的生命力,是由于它有着不同于其他语言的特点,正如同FORTRAN和C等高级语言使人们摆脱了需要直接对计算机硬件资源进行操作一样,被称作为第四代计算机语言的MATLAB,利用其丰富的函数资源,使编程人员从繁琐的程序代码中解放出来。

MATLAB最突出的特点就是简洁。

MATLAB用更直观的,符合人们思维习惯的代码,代替了C 和FORTRAN语言的冗长代码。

MATLAB给用户带来的是最直观,最简洁的程序开发环境。

以下简单介绍一下MATLAB的主要特点。

(1)语言简洁紧凑,使用方便灵活,库函数极其丰富。

MATLAB程序书写形式自由,利用起丰富的库函数避开繁杂的子程序编程任务,压缩了一切不必要的编程工作。

由于库函数都由本领域的专家编写,用户不必担心函数的可靠性。

可以说,用MATLAB进行科技开发是站在专家的肩膀上。

(2)运算符丰富。

由于MATLAB是用C语言编写的,MATLAB提供了和C语言几乎一样多的运算符,灵活使用MATLAB的运算符将使程序变得极为简短。

(3)MATLAB既具有结构化的控制语句(如for循环,while循环,break 语句和if语句),又有面向对象编程的特性。

(4)程序限制不严格,程序设计自由度大。

例如,在MATLAB里,用户无需对矩阵预定义就可使用。

(5)程序的可移植性很好,基本上不做修改就可以在各种型号的计算机和操作系统上运行。

(6)MATLAB的图形功能强大。

在FORTRAN和C语言里,绘图都很不容易,但在MATLAB里,数据的可视化非常简单。

MATLAB还具有较强的编辑图形界面的能力。

(7)MATLAB的缺点是,它和其他高级程序相比,程序的执行速度较慢。

由于MATLAB的程序不用编译等预处理,也不生成可执行文件,程序为解释执行,
所以速度较慢。

(8)功能强大的工具箱是MATLAB的另一特色。

MATLAB包含两个部分:核心部分和各种可选的工具箱。

核心部分中有数百个核心内部函数。

其工具箱又分为两类:功能性工具箱和学科性工具箱。

功能性工具箱主要用来扩充其符号计算功能,图示建模仿真功能,文字处理功能以及与硬件实时交互功能。

功能性工具箱用于多种学科。

而学科性工具箱是专业性比较强的,如control,toolbox, signl processing toolbox,
commumnication toolbox等。

这些工具箱都是由该领域内学术水平很高的专家编写的,所以用户无需编写自己学科范围内的基础程序,而直接进行高、精、尖的研究。

(9)源程序的开放性。

开放性也许是MATLAB最受人们欢迎的特点。

除内部函数以外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的文件构成新的工具箱。

1.3.4 MATLAB在图像处理中的应用
图像处理工具包是由一系列支持图像处理操作的函数组成的。

所支持的图像处理操作有:图像的几何操作、邻域和区域操作、图像变换、图像恢复与增强、线性滤波和滤波器设计、变换(DCT变换等) 、图像分析和统计、二值图像操作等。

下面就MATLAB 在图像处理中各方面的应用分别进行介绍。

(1)图像文件格式的读写和显示。

MATLAB 提供了图像文件读入函数imread(),用来读取如:bmp、tif、tiffpcx 、jpg 、gpeg 、hdf、xwd等格式图像文;图像写出函数 imwrite() ,还有图像显示函数 image()、imshow()等等。

(2)图像处理的基本运算。

MATLAB 提供了图像的和、差等线性运算,以及卷积、相关、滤波等非线性算。

例如,conv2(I,J)实现了I,J两幅图像的卷积。

(3)图像变换。

MATLAB 提供了一维和二维离散傅立叶变换(DFT) 、快速傅立叶变换(FFT) 、离散余弦变换 (DCT) 及其反变换函数,以及连续小波变换(CWT)、离散小波变换(DWT)及其反变换。

(4)图像的分析和增强。

针对图像的统计计算MATLAB 提供了校正、直方图均衡、中值滤波、对比度调整、自适应滤波等对图像进行的处理。

(5)图像的数学形态学处理。

针对二值图像,MATLAB 提供了数学形态学运算函数;腐蚀(Erode)、膨胀(Dilate)算子,以及在此基础上的开 (Open)、闭(Close)算子、厚化 (Thicken) 、薄化 (Thin) 算子等丰富的数学形态学运算。

以上所提到的 MATLAB在图像中的应用都是由相应的MATLAB函数来实现的,使用时,只需按照函数的调用语法正确输入参数即可。

具体的用法可参考MATLAB
丰富的帮助文档。

图像边缘对图像识别和计算机分析十分有用,在MATLAB中,函数 edge()用于灰度图像边缘的提取,它支持六种不同的边缘提取方法,即Sobel方法、Prewitt 方法、Robert 方法,Laplacian2Gaussian方法、过零点方法和Canny方法。

第2章整体设计
2.1 设计思路
利用matlab的GUI程序设计一个简单实用的图像处理程序。

该程序应具备图像处理的常用功能,以满足用户的使用。

现设计程序有以下基本功能:
1)图像的读取和保存。

2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。

3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。

4)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。

5)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存。

6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。

2.2 整体界面
图2.2.1 总体设计界面布局
图2.2.2 菜单栏的设计
图2.2.3 功能切换选择组
显示区域:左侧显示原图,右侧显示操作的图片
操作区域:
上方菜单栏:包括文件、编辑、图像编辑等功能
左侧快捷操作:包含一些常用操作,还原、旋转、裁剪、撤销
下方功能切换选择组:包含一些图片处理的常用操作,噪声、滤除噪声、频谱分析等。

第3章具体设计与功能的实现
3.1 文件
3.1.1 打开
为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件,所以设置这里的缺省后缀名为“.bmp”。

Uigetfile函数的调用格式为[name,path]=yigetfile(…), 在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“name”和“path”中。

如果按下取消按钮或是发生错误,则返回值是0。

根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.img。

程序如下所示:
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像');
if isequal(filename,0)|isequal(pathname,0)
errordlg('没有选中文件','载入图片失败');
return;
else
file=[pathname,filename];
global S %设置一个全局变量S,保存初始图像路径,以便之后的还原操作 S=file;
x=imread(file);
set(handles.axes1,'HandleVisibility','ON');
axes(handles.axes1);
imshow(x);
set(handles.axes1,'HandleVisibility','OFF');
axes(handles.axes2);
imshow(x);
handles.img=x;
guidata(hObject,handles);
End
(a) (b)
图3.1.1 (a)(b)载入新图像
3.1.2 保存
同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite函数,把数据i存到指定的文件。

程序如下所示:
[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');
if ~isequal([sfilename,sfilepath],[0,0])
sfilefullname=[sfilepath ,sfilename];
imwrite(handles.img,sfilefullname);
else
msgbox('取消保存','保存失败');
End
图3.1.2 图像的保存
3.1.3 退出
退出程序如下所示:
close(gcf);
3.2 编辑
3.2.1 图片的缩放
图3.2.1 编辑菜单下的缩放功能
在MATLAB中,用函数imresize来实现对图像的放大或缩小。

该函数的调用格式如下:
B=imresize(A,m,method)
其中:参数method用于指定插值的方法,可选的值为“nearest”(最近邻法),“bilinear”(双线性插值)、“bicubic”(双三次插值),缺省值为“nearest”。

B=imresizee(A.m,method)表示返回原图A的m倍放大图像(m小于1时实际上是缩小);
图3.2.2 输入缩放倍数
图3.2.3 放大后的图片
图3.2.5缩小后的图片
图3.2.6 各文件的大小
图片上并不能够看出放大缩小后图片的明显变化,从文件大小可以看到明显差别,缩放的程序如下:
% 最邻近插值
function Untitled_20_Callback(hObject, eventdata, handles)
global T
axes(handles.axes2);
T=getimage;
prompt={'输入缩放倍数:'};
defans={'2'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
f=imresize(handles.img,p1,'nearest'); %用最邻近插值法实现图片的缩放
imshow(f);
handles.img=f;
guidata(hObject,handles);
% 双线性插值
function Untitled_21_Callback(hObject, eventdata, handles)
global T
axes(handles.axes2);
T=getimage;
prompt={'输入缩放倍数:'};
defans={'1'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
f=imresize(handles.img,p1,'bilinear'); %用双线性插值法实现图片的缩小
imshow(f);
handles.img=f;
guidata(hObject,handles);
3.2.2 图片的翻转
图3.2.1 编辑菜单下的翻转功能
函数flipud是实现一个二维矩阵的上下翻转,如a=[1 2;3 4],经过该函数处理后,原矩阵变为[3 4;1 2];所以利用该函数也可以对图像进行上下翻转处理。

但由于该函数针对二维数据的处理,所以在翻转前需要先对图片进行灰度处理。

3.2.2.1 左右翻转
图3.2.2.1.1 图像的左右翻转
3.2.2.2 上下翻转
图3.2.2.1.1 图像的上下翻转
程序如下所示:
% 左右翻转
function Untitled_14_Callback(hObject, eventdata, handles) global T
axes(handles.axes2);
T=getimage;
f=fliplr(handles.img);
imshow(f);
handles.img=f;
guidata(hObject,handles);
%上下翻转
function Untitled_15_Callback(hObject, eventdata, handles)
global T
axes(handles.axes2);
T=getimage;
f=flipud(handles.img);
imshow(f);
handles.img=f;
guidata(hObject,handles);
3.3 图像
图像菜单包括灰度处理、亮度调整和对比度调整。

图3.3.1 图像菜单
3.3.1 灰度
可利用rgb2gray(X)函数对其他图像进行灰度图像的转化。

效果如下图所示:
图3.3.1.1 图片的灰度处理
程序如下所示:
function Untitled_18_Callback(hObject, eventdata, handles)
global T
axes(handles.axes2);
T=getimage;
x=rgb2gray(handles.img); %灰度处理imshow(x);
handles.img=x;
guidata(hObject,handles);
3.3.2 调整
3.3.2.1亮度
亮度的调整分为增强和减弱,函数调用格式分别为:f=immultiply(handles.img,p1);
f=imdivide(handles.img,p1);
亮度增强操作:
图3.3.2.1.1输入亮度增强倍数
图3.3.2.1.1亮度增强效果
亮度减弱操作:
图3.3.2.1.1输入亮度减弱倍数
图3.3.2.1.1亮度减弱效果
%亮度增强
global T
axes(handles.axes2);
T=getimage;
prompt={'增强倍数'};
defans={'1'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
f=immultiply(handles.img,p1);
imshow(f);
handles.img=f;
guidata(hObject,handles);
% 亮度减弱
function Untitled_23_Callback(hObject, eventdata, handles) global T
axes(handles.axes2);
T=getimage;
prompt={'减弱倍数'};
defans={'1'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
f=imdivide(handles.img,p1);
imshow(f);
handles.img=f;
guidata(hObject,handles);
3.3.2.2 对比度
对比度调整的函数调用格式为:
y=imadjust(handles.img,[ ], [ ],p1);
输入的值大于一则增强对比度,小于一则减小对比度
图3.3.2.2.1 输入调整倍数
图3.3.2.2.2 图像对比度的增强和减弱(左一为原图)其程序如下所示:
%对比度的调整
function Untitled_19_Callback(hObject, eventdata, handles)
axes(handles.axes2);
T=getimage;
prompt={'输入倍数'};
defans={'1'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
y=imadjust(handles.img,[ ], [ ],p1);
imshow(y);
handles.img=y;
guidata(hObject,handles);
3.4 快捷操作
快捷操作栏在界面的左侧,包含还原、旋转、裁剪(截图)和撤销。

3.4.1 还原
%还原
function pushbutton1_Callback(hObject, eventdata, handles)
global S
axes(handles.axes2);
y=imread(S);
f=imshow(y);
handles.img=y;
guidata(hObject,handles); 图3.4.1 快捷操作
3.4.2 旋转
用函数imrotate来实现对图像的插值旋转。

该函数的调用格式如下:
B=imrotate(A,angle,method,’crop’)
其中,参数method用于指定插值的方法,可选的值可以有三种,分别为邻近插值,双线性插值,双三次插值,缺省时为邻近插值,参数angle代表旋转的角度。

图3.4.2.1 输入旋转角度
图3.4.2.2 将图像旋转30度
程序如下所示:
%用双线性插值法进行图像的任意角度的旋转
function pushbutton3_Callback(hObject, eventdata, handles)
global T
axes(handles.axes2);
T=getimage;
prompt={'Angle:'};
defans={'0'};
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
f=imrotate(handles.img,p1,'bilinear','crop'); %用双线性插值法进行旋转imshow(f);
handles.img=f;
guidata(hObject,handles);
3.4.3 裁剪
在MATLAB中,用函数imcrop实现对图像的剪切操作。

该操作剪切的是图像中的一个矩形子图,用户可以通过参数指定这个矩形四个顶点的坐标,也可以交互地用鼠标选取这个矩形。

Imcrop函数的调用格式如下:
y=imcrop(handles.img);
图3.4.3.1 剪切后的图像
程序如下所示:
%图像的裁剪(截图)
function pushbutton2_Callback(hObject, eventdata, handles)
global T
axes(handles.axes2);
T=getimage;
x=imcrop(handles.img); •
imshow(x);
handles.img=x;
guidata(hObject,handles);
3.4.4 撤销
撤销上一步的操作。

通过另设一个全局变量T保存是上一次操作后的图像。

实现程序如下所示:
function pushbutton4_Callback(hObject, eventdata, handles)
axes(handles.axes2);
global T
imshow(T);
handles.img=T;
guidata(hObject,handles);
该程序段只是简单的显示图像的功能,其中全局变量T中储存的是上一步操作处理后的图像信息。

在以上的各段功能程序段中可见均有“T=getimage;”,此句把当前操作前的图像,即上一次操作后的图像信息赋予全局变量T。

3.5 噪声
经常用到的噪声有三种,高斯噪声,椒盐噪声,乘性噪声,可以通过以下三个函数来实现:
y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声
y=imnoise(x,'salt & pepper',p1); %椒盐噪声
y=imnoise(handles.img,'speckle',p1); %乘性噪声
图3.5.1 噪声
叠加噪声后的图像如下图所示:
(a) (b)
(c) (d)
图3.5.2 三种噪声的叠加效果
(a)原图(b)叠加椒盐噪声(c)叠加高斯噪声(d)叠加乘性噪声
程序如下所示:
function radiobutton1_Callback(hObject, eventdata, handles) axes(handles.axes2);
x=(handles.img);
y=imnoise(x,'salt & pepper',0.04); %叠加0.04的椒盐噪声imshow(y);
imwrite(y,'salt.jpg');
title('添加椒盐噪声')
function radiobutton2_Callback(hObject, eventdata, handles) axes(handles.axes2);
x=(handles.img);
y=imnoise(x,'gaussian',0,0.05); %叠加0.05的高斯噪声imshow(y);
imwrite(y,'gaussian.jpg');
title('添加高斯噪声')
function radiobutton3_Callback(hObject, eventdata, handles) axes(handles.axes2);
x=(handles.img);
y=imnoise(x,'speckle',0.05); %叠加0.05的乘性噪声imshow(y);
imwrite(y,'speckle.jpg');
title('添加乘性噪声')
3.6 滤除噪声
图3.6.1噪声的滤除
这里选择三种滤波方法,
k=medfilt2(handles.noise_img);%中值滤波
k=wiener2(handles.noise_img,[5,5]);%自适应滤波
k=filter2(fspecial('average',3),handles.noise_img)/255;%平滑滤波此处以椒盐噪声的滤除为例:
(a) (b)
(c) (d) (e)
图3.6.2 三种噪声的滤除方法
(a)原图(b)添加椒盐噪声(c)中值滤波(d)线性滤波(e)自适应滤波
程序如下所示:
%中值滤波
function
radiobutton4_Callback(hObjec
t, eventdata, handles)
axes(handles.axes2);
k=medfilt2(handles.img);
imshow(k);
handles.img=k;
guidata(hObject,handles);
%线性滤波
function radiobutton5_Callback(hObject, eventdata, handles)
axes(handles.axes2);
T=getimage;
h=[1 1 1;1 1 1;1 1 1];
H=h/9;
i=double(handles.img);
k=convn(i,h);
imshow(k,[]);
handles.img=k;
guidata(hObject,handles);
%自适应滤波
function radiobutton6_Callback(hObject, eventdata, handles)
axes(handles.axes2);
T=getimage;
k=wiener2(handles.img,[5,5]);
imshow(k);
handles.img=k;
guidata(hObject,handles);
3.7 频谱分析
图3.7.1 频谱分析
3.7.1 巴特沃斯低通滤波器
经过巴特沃斯低通滤波器处理后的图像如下图所示:
图3.7.1.1 低通滤波器滤波后
function radiobutton8_Callback(hObject, eventdata, handles) axes(handles.axes2);
x=(handles.img);
y1=imnoise(x,'salt & pepper');
f=double(y1); % 数据类型转换
g=fft2(f); % 傅立叶变换
g=fftshift(g); % 转换数据矩阵
[M,N]=size(g);
nn=2; % 二阶巴特沃斯低通滤波器
d0=50; %截止频率为50
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=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); % 显示滤波处理后的图像
imwrite(y3,'butterdi.jpg');
3.7.2 高斯高通滤波器
经过高斯高通滤波器处理后的图像如下图所示:
图3.7.2.1 高通滤波器滤波后
function radiobutton9_Callback(hObject, eventdata, handles)
axes(handles.axes2);
x=(handles.img);
y1=imnoise(x,'gaussian');
f=double(y1); % 数据类型转换
k=fft2(f); % 傅立叶变换
g=fftshift(k); % 转换数据矩阵
[M,N]=size(g);
nn=2;
d0=25; %截止频率为25
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2); % 计算高通滤波器传递函数 if d<=d0
h=0;
else h=1;
end
result(i,j)=h*g(i,j);
end
end
result=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3);
imwrite(y3,'gaussiangao.jpg');
3.7.3 频谱图
为了得到图像的频谱图,先要对数据进行傅里叶变换,用fft2函数对二维数据进行快速傅里叶变换,同时为了更好的观察频谱图,需要把fft2变换后的数据进行平移,利用fftshift函数,把快速傅里叶变换的DC 组件移到光谱中心。

这样图像能量的低频成分将集中到频谱中心,图像上的边缘、线条细节信息等高频成分将分散在图像频谱的边缘。

如下图所示:
图3.7.3.1 频谱图
程序如下所示:
function radiobutton11_Callback(hObject, eventdata, handles)
axes(handles.axes2);
x=(handles.img);
J2=fft2(x); %傅立叶变换
K2=fftshift(J2); %转换数据矩阵
imshow(log(abs(K2)),[]); %显示频谱图
3.8 颜色模型转换
图3.8.1 颜色模型转换
RGB颜色模型到HSV模型的转换程序:
axes(handles.axes2);
x=(handles.img);
if isrgb(x)
HSV=rgb2hsv(x);
imshow(HSV);
else
msgbox('灰度图像,不能转换','转换失败');
end
转换后的结果为:
图3.8.2 RGB模式转HSV模式
转化为ntsc和ycbcr模型,只要改为相应的函数即可。

函数如下: rgb2ntsc(x); % rgb模型转ntsc模型
rgb2ycbcr(x); % rgb模型转ycbcr模型
图3.8.3 RGB模式转NTSC模式和YCBCR模式
3.9 直方图
图3.9.1 直方图
用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,这两个函数同样只使用于二维数据,所以也要先对二维图像进行灰度处理。

图3.9.2 直方图均衡
图3.9.3 直方图统计
程序如下所示:
%直方图均衡
function radiobutton15_Callback(hObject, eventdata, handles) global T
axes(handles.axes2);
T=getimage;
h=histeq(handles.img);
imshow(h);
handles.img=h;
guidata(hObject,handles);
% 直方图统计
function radiobutton16_Callback(hObject, eventdata, handles) axes(handles.axes2);
x=imhist(handles.img);
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
axis([-10 255 0 15000]);
set(handles.axes2,'xtick',0:50:255);
set(handles.axes2,'ytick',0:2000:15000);
通过本次课程设计,使自己对MATLAB GUI设计流程有了比较深刻的体会,同时也了解了一般软件设计的过程。

在设计过程中碰到了很多的问题,通过这些问题,使自己分析问题,解决问题的能力得到了较大的提高。

一些功能只支持灰度图像的处理,如图像的翻转,因此在一些处理前应先对图像进行灰度处理。

由于一般图像中含有较多的低频信息成分高频成分较少,通过低通滤波后,噪声以及高频成分被滤除,图像虽有少量失真,略显模糊,但尚可辨识。

但若是通过高通滤波后,大量的有效低频信息被滤除,图像严重失真,不可辨识。

有时候操作是独立的,操作后无法叠加别的效果。

应该是整个程序设计过
中对变量的设置没有做好,改进后,把处理后的数据保存在一个全局变量,这样还要对处理后的数据进行在处理时,只要把这个全局变量作为原始数据带入就可。

这些问题解决后,整个设计就容易多了。

通过为期两周的matlab课程设计实践,使我对matlab的使用有了进一步的了解和熟悉。

当拿到此次的课题时,由于经常使用photoshop的缘故,对图像处理这个课题比较感兴趣,因此选择了这个课题。

但是以前学matlab时没有学过GUI,因袭感到有些茫然,不知自己能不能完成。

后来通过在网上查找资料和借阅相关书籍,对GUI有了些了解,对这个课题就有了些信心。

本课题的重点是句柄的使用、GUI的使用以及matlab中相关图像处理函数使用,掌握了这些,这个课题就不会很困难。

总体来说,此次的课程设计,还是较为满意的。

它不但鞭策着我去巩固matlab的基础理论知识,还提高了我对matlab的实际操作运用,使得理论与实践相结合,让我深刻认识到我们学的知识在生活中可以灵活运用的,不能死读书,要勤于思考、发现,并且大胆实践;同时,在实践的过程中,也让我体会到了努力付出并得到回报的满足感觉。

课程设计即将完成,尽管完成的过程并不是很顺利,但是,在老师和同学的帮助下,我克服了课程设计中的许多困难,我才能完成这个课题。

借此机会,我要对帮助过我的人表示深深的感谢。

这次毕业课程设计能够顺利完成,是所有曾经指导过我的老师,帮助过我的同学帮助和鼓励的结果。

在论文完成之际,我要感谢我的指导老师邹老师的悉心指导。

GUI等内容是之前没接触过的,每个同学都或多或少存在些问题和困惑,因此都会请教老师。

老师带的学生比较多,就算每人一个问题,加在一起也有好几十个问题。

但是无论谁问问题,老师都会耐心解答,从不敷衍。

这让我学到一种态度,对待工作的认真与热情。

这对我以后的学习和工作都会有莫大的影响。

从开始的选题到中期的修改,再到最终定稿,邹老师给了同学许多宝贵的意见。

正是有了老师的悉心教诲和无私的帮助,我们才得以顺利的完成此次课程设计,在此表示我深深的谢意。

在论文的写作过程中,也得到许多同学的宝贵建议。

在我遇到困难时候他们总是可以帮我调整心情,让我清理思路重新开始。

课程设计是一个不算漫长的学习过程,但是课程设计的结束仅仅是一个新的开始。

在课程设计中,我慢慢的掌握了设计时所需要的知识,这也让我认识到主动去自学一些东西的重要性,这也是大学几年学习的意义所在。

参考文献
[1]于万波,《基于MATLAB的图像处理》,清华大学出版社,2008.3
[2]闫敬文,《数字图像处理MATLAB版》,国防工业出版社,2007.2
[3]章毓晋,《图像处理与分析》,北京清华大学出版社,2004.7
[4]飞思科技产品研发中心,《MATLAB6.5辅助图像处理》,电子工业出版社,2003.1
[5]陈桂明,张明照,《应用MATLAB语言处理信号与数字图像》,科学出版社,2000.5
[6]陈杨,陈荣娟,《MATLAB6.X图像编程与图像处理》,西安电子科技大学出版社,2002.10
[7]孙家广,杨长贵,《计算机图形学》,清华大学出版社,1995.5。

相关文档
最新文档