MATLAB数字图像课设.docx
- 文档编号:4312247
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:13
- 大小:107.88KB
MATLAB数字图像课设.docx
《MATLAB数字图像课设.docx》由会员分享,可在线阅读,更多相关《MATLAB数字图像课设.docx(13页珍藏版)》请在冰豆网上搜索。
MATLAB数字图像课设
河北建筑工程学院
课程设计报告
课程名称:
电子综合课程设计
题目名称:
基于Vc与Matlab混合编程
图像信号处理系统实现
学院:
电气工程学院
专业:
电子信息工程
班级:
学号:
学生姓名:
指导教师:
职称:
讲师
成绩:
2016年7月15日
目录
第一章引言.........................................................1
第二章体设计方案...................................................2
2.1设计思路...............................................................2
2.2总体设计框图...........................................................4第三章设计原理.....................................................5
3.1部分处理原理及引擎介绍.................................................5
3.2引擎函数功能...........................................................6
第四章系统实现.....................................................8
4.1主界面.................................................................8
4.2链接...................................................................8
4.3程序...................................................................9
4.4图像处理实现过程.......................................................11
第五章心得体会....................................................14
第一章引言
数字图像处理(DigitalImageProcessing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。
数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。
随着计算机的发展,数字图像处理技术也不断的进步,实现了对图像图像增强、复原、编码、压缩等,在空间和军事高科技中扮演越来越重要的角色。
图像处理的基础是数字,主要任务是进行各种算法设计和算法实现。
通过界面实现显示原数字图像以及操作后的效果图。
通过界面实现不同操作方法的选择、参数设置等,能通过编程实现对处理后的图像进行保存、生成新的图像文件,能实现不少于6种基本操作。
其目的是进一步理解数字图像的原理、基本操作;掌握用MATLAB对数字图像处理操作的实现过程;学习使用VisualC++进行软件编程;熟悉数字图像文件的基本格式。
随着数字化与多媒体时代的来临,数字图像处理已经成为必备的基础知识。
近几十年来由于计算机技术的蓬勃发展,图像处理技术也得到了空前的发展和应用。
目前,图像处理技术已经广泛应用于工业、军事、医学、交通、农业、天气预报、银行、超市、重要部门的监控报警系统、可视电话、网络传输等等领域,成为各个学科学习和研究对象。
随着图像处理技术的广泛应用,学习和掌握这门科学显得格外重要,图像处理已经成为信息技术相关领域的核心课程。
本课题主要实现图像的一些简单特效显示,图像的旋转和镜像、图像的增强处理,图像灰度变换,图像边缘检测等。
数字图像处理采用一定的算法对数字图像进行处理,以获得人眼视觉或者某种接受系统所需要的图像处理过程。
图像处理的基础是数字,主要任务是进行各种算法设计和算法实现。
通过界面实现显示原数字图像以及操作后的效果图。
通过界面实现不同操作方法的选择、参数设置等,能通过编程实现对处理后的图像进行保存、生成新的图像文件,能实现不少于6种基本操作。
其目的是进一步理解数字图像的原理、基本操作;掌握对数字图像处理操作的实现过程;学习使用VisualC++进行软件编程;熟悉数字图像文件的基本格式。
第二章总体设计方案
2.1设计思路
首先建立OPEN()函数,然后调用子程序OpenBMP(CStringfileName)打开bmp位图,调用子程序DrawPic(unsignedchar*pDa,intdx,intdy)显示图片。
接着实现图像高斯白、椒盐、中值滤波、均值滤波、锐化、灰度变换、图像复原、自适应变换等功能。
混合编程:
设计方案一:
Matlab调用C/C++
Matlab调用C/C++的方式主要有两种:
利用MEX技术和调用C/C++动态连接库。
在Matlab与C/C++混合编程之前,必须先对Matlab的编译应用程序mex和编译器mbuild进行正确的设置:
对Matlab编译应用程序mex的设置:
Mex –setup;对Matlab编译器mbuild的设置:
Mbuild –setup.
调用C/C++的MEX文件:
MEX是Matlab Executable的缩写,它是一种“可在Matlab中调用的C(或Fortran)语言衍生程序”。
MEX文件的使用极为方便,其调用方式与Matlab的内建函数完全相同,只需在Matlab命令提示符下键入MEX文件名即可。
一个C/C++的MEX源程序通常包括4个组成部分,其中前3个是必须包含的内容,第4个则根据所实现的功能灵活选用:
(1)#include “mex.h”;
(2)MEX文件的入口函数mexFunction, MEX文件导出名必须为mexFunction函数;(3)mxArray;(4)API函数
设计方案二:
调用MATLAB引擎。
所谓MATLAB引擎(engine),是指一组MATLAB提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对MATLAB的控制。
与其他各种接口相比,引擎所提供的MATLAB功能支持是最全面的。
通过引擎方式,应用程序会打开一个新的MATLAB进程,可以控制它完成任何计算和绘图操作。
对所有数据结构提供100%的支持。
同时,引擎方式打开的MATLAB进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制MATLAB运行的流程,并可在其中输入任何MATLAB命令。
该方案在VisualC++6.0编程中,程序较为简单,添加头文件“#include“engine.h””后配合基本的命令程序语句即可使用。
设计方案三:
COM组件:
组件对象模型(简称MCR)是以组件为发布单元的对象模型。
它提供一种可以共享二进制代码的工业标准,允许任何符合标准的程序访问,所以COM作为不同语言之间的协作开发是非常方便的。
MATLAB的COM编译器是在MATLAB6.5中才开始提供的一个新工具,从MATLAB7.0起,这个产品改名为MATLABBuilderforCOM。
基于COM的混合编程方法也是Mathworks公司推荐使用的方法。
综合考虑:
以上四种方法中,采用MATLAB引擎方式,应用程序整体性能好,MATLAB引擎支持功能全面,但需要MATLAB后台运行,不能脱离MATLAB环境。
而MCC方法和COM组件方法均可已脱离MAYLAB环境,应用程序运行效率高。
开始我们选择mcc编译器的方法进行混合编程,但是经过后期的编程、运行和调试后发现,难度较大,无法及时完成本次课程设计任务。
所以最终我们选择了调用MATLAB的引擎函数engine函数的方法,即方案二。
图2.1主界面流程图
2.2总体设计框图
图2.2总体设计框图
第三章设计原理
3.1部分处理原理及引擎介绍
基于课本上所学的知识,我们初步了解了数字图像的一些基本知识,掌握了基本的程序编写,通过VC实现主界面的设计和编写,并通过超链接连接到MATLEB,在MATLEB中进行图像处理,其中中值滤波选一个含有基数点的滑动窗口,在图像上进行扫描,将其中所含像素点按灰度级升序排列,取位于中间的灰度值来代替该点的灰度值。
中值滤波原理:
(1)做一个M*M的作用模板
(2)在其中选择K个与待处理像素的灰度差最小的像素(3)用这K个像素的灰度均值替换原来的值。
其中部分引擎原理为:
Matlab引擎,是Matlab提供的一系列程序的结合,它允许用户在自己的应用程序中对Matlab进行调用,将Matlab作为一个操作引擎使用,使其在后台运行。
同时Matlab提供的接口函数它采用客户机/服务器计算模式,并且支持VC语言。
一般情况下,客户机是运行前端软件的PC机,并且知道如何与服务器通信,服务器与此相对应,是接收请求信息,并采取相应行为的机器。
具体在VC中使用Matlab引擎来编制程序时,VC是作为客户端出现的,即负责用户接口和提出数据请求,而Matlab则属于服务器端,即向客户端提供数据服务。
VC客户端通过调用Matlab引擎与Matlab服务器建立连接,从而实现动态通信。
其引擎调用全过程如图3.1所示。
图3.1引擎调用全过程
在Matlab环境中将Matlab函数编译成可以脱离Matlab环境使用的动态连接库,在VC环境中编写应用程序界面并加载调用动态连接库,实现二者之间的无缝连接,此种方法关键是对Matlab与VC接口进行编程。
由于其完全脱离Matlab环境,因此得到广泛应用。
采用目前较为流行的Windows应用程序开发环境VC完成图形界面设计、数据管理、低层I/O操作,利用Matlab数学库完成软件核心算法设计,很大程度上降低了编程难度和工作量,缩短开发周期,提高软件可靠性。
尤其利用编译器调用Matlab动态连接库实现脱离Matlab环境下二者的紧密结合,更极大拓展了Matlab的应用范围。
3.2引擎函数功能
Matlab引擎函数库中的函数具体功能如下:
(1)engOpen()启动Matlab引擎:
语法:
#include"engine.h"
Engine*engOpen(constchar*startcmd);
说明:
通过函数engOpen用户可以在自己的应用程序中,在后台启动一个Matlab进程,用于完成一定的计算任务,其返回值是一个Engine类型的指针变量,若函数执行成功将返回开启的Matlab引擎的指针,否则为NULL,其输入参数为一字符指针startcmd,在windows操作系统必须为NULL。
(2)engPutArray()将mxArray结构体类型变量输送到Matlab的工作空间:
语法:
#include"engine.h"
intengPutArray(Engine*ep,constmxArray*mp);
说明:
引擎函数engPutArray包含两个输入参数,分别为引擎指针ep和MxArray结构体对象指针。
执行该函数,允许用户将一个MxArray结构体类型的变量输送到引擎ep中,如果在当前程序的工作空间中不存在所指定的MxArray结构体,函数会自动创建,如函数执行成功,返回值为0,否则为1。
(3)engEvalString()执行一个字符串表示的Matlab表达式:
语法:
#include"engine.h"
intengEvalString(Engine*ep,constchar*string);
第一个参数ep为一个Engine类型的指针。
第二个参数String为字符指针代表了一个字符串,该字符串应该为一个合法
的Matlab表达式。
若该函数执行成功将返回0,否则将返回1。
(4)engGetArray()从Matlab工作空间中获取一个变量:
语法:
#include"engine.h"
mxArray*engGetArray(Engine*ep,constchar*name);
说明:
在使用函数engGetArray时必须提供两个参数。
第一个指向Matlab引擎的指针变量ep。
第二个指向某字符串的字符指针name。
通过engGetArray(),用户可以从Matlab的工作空间中获取使用参数name指定的mxArray结构体的内容,同时复制给一个新分配的mxArray结构体,并将该结构体返回给用户。
若该函数执行成功,将得到一个mxArray结构体对象的指针,否则返回NULL。
(5)engOutputBuffer确定存放Matlab输出结果的缓冲区域
语法:
#include"engine.h"
intengOutputBuffer(Engine*ep,char*p,intn)
说明:
通过引擎函数engOutputBuffer,用户可以为由引擎指针ep所指向的引擎设置一个输出缓冲区,将Matlab输出到屏幕的内容保存在其中,其长度可由参数n确定,位置由字符指针p来确定。
在默认情况下,通过引擎函数engEvalString所执行的所有的Matlab操作所产生的屏幕输出均被抛弃,而函数engOutputBuffer则告诉所有后继的engEvalString操作,将屏幕输出保存在缓冲p中。
(6)engClose()关闭Matlab引擎
语法:
#include"engine.h"
intengClose(Engine*ep);
说明:
通过此函数用户可以关闭一个处于开启状态的Matlab引擎,该函数在执行时,首先向Matlab引擎发出一个关闭命令,然后断开与Matlab引擎的连接,若函数执行成功将返回0,否则返回1。
此外,Matlab引擎函数库还包括一些函数,有engGetFull(Obsolete)、engGetMatrix(Obsolete)、engPutFull(Obsolete)、engPutMatrix(Obsolete)等一些过时的函数,这些函数在Matlab5.X以上版本的引擎程序中不应继续被使用[7]。
引擎接口为在VC中调用Matlab服务提供了应用程序接口(API),主要由以上的引擎(Engine)库函数来实现,完成VC客户端与Matlab服务器的连接建立与撤销、数据的传递与接收。
在VC中使用Matlab引擎编程的另一个重要问题是VC数据类型与mxArray矩阵的相互转换,即数据组织。
Matlab中有15种基本数据类型,主要是整型、浮点、逻辑、字符、日期和时间、结构数组、单元格数组以及函数句柄等。
Matlab对所有的VC++数据类型均使用同一种专门的mxArray矩阵结构来描述和存储,每个mxArray矩阵结构包含类型、维度、数据、稀疏矩阵、非零元索引、结构等字段说明。
Matlab通过mxArray矩阵结构及其相关函数来实现对数据的组织。
可以说,Matlab的数据组织是利用Matlab引擎进行VC编程的核心,不同的VC数据类型对应着不同的数据组织方式。
数据组织方式正确与否直接影响着对Matlab引擎的调用是否成功,决定着VC客户端与Matlab服务器之间动态数据交换的有效性[8]。
Matlab与VC数据类型之间的相互转换如表1所示。
表1类型转换表
VC数据类型
Matlab矩阵类型
Double
Double-PrecisionMatrices
Float\Int\Unsigned
NumericMatrices
Char\CString
MatlabStrings
Struct
Structs
Class
Objects
第四章系统实现
4.1主界面
图4.1
该界面利用VC++6.0中的MFC功能编辑而成,使用MFC可以方便地创建基于对话框或文档视图的程序,在其上添加各种控件,通过消息映射机制使控件操作和某个函数对应起来。
(1)新建工程,选择“MFCAppWizard[exe]”类;
(2)在生成的工程里,插入新的Dialog对话框,添加按钮和编辑框;
(3)新建class类型,然后使得Dialog对话框连接到Menu框中;
(4)然后编辑代码,运行成功后,即可以调用新建的数字图像处理系统对话框。
控件包括:
CStatic类:
静态文本空间,用于标注、分隔对话框和窗口中的其他控件;
CButton类:
按钮空间窗口,为对话框或窗口中的按钮、检查框或单选框提供接口;
CEdit类:
文本编辑对话窗口,用于接收用户的文本输入;
本次课程设计基本就使用了以上控件类型,完成了相对应的功能选择。
4.2连接
VC++调用MATLAB引擎函数具体步骤:
1)设置系统环境变量path,path里面要包括MATLAB的exe。
双击path,变量设为C:
\MATLAB7\bin;C:
\MATLAB7\bin\win32
2)设置VC路径
运行VC,转到optionsinclude增加MATLAB的include路径:
C:
\MATLAB7\EXTERN\INCLUDE\LIB和C:
\MATLAB7\EXTERN\LIB\WIN32\MICROSOFT
3)在VX中新建一个console项目,项目的link输入增加libmx.liblibmat.liblibmex.liblibeng.lib。
一般的经历这三步后,基本就能成功运行利用该编辑窗口编辑的代码了。
我们也是在完成以上三步后,完善的界面设计和引擎函数调用编程。
4.3程序
加入高斯白噪声:
functiongaosibai
I=imread('C:
\111.jpg');
subplot(1,2,1),imshow(I);
J=imnoise(I,'gaussian',0,0.02);
subplot(1,2,2),imshow(J);
加入椒盐噪声:
functionjiaoyan
I=imread('C:
\111.jpg');
subplot(1,2,1),imshow(I);
J=imnoise(I,'salt&pepper',0.04);
subplot(1,2,2),imshow(J);
中值滤波处理:
functionzhongzhilvbo
I=imread('C:
\111.jpg');
K=rgb2gray(I);
subplot(2,2,1),imshow(I);
J=imnoise(K,'salt&pepper',0.04);
subplot(2,2,2),imshow(J);
I_Filter=medfilt2(J);
subplot(2,2,3),imshow(I_Filter);
均值滤波处理:
functionjunzhilvbo
[Imap]=imread('C:
\111.png');
subplot(2,2,1),imshow(I);
J=rgb2gray(I);
J1=imnoise(J,'gaussian',0,0.02);
subplot(2,2,2),imshow(J1);
M4=[010;101;010];
M4=M4/4;
I_filter=filter2(M4,J1);
subplot(2,2,3),imshow(I_filter);
锐化处理:
functionruihua
I=imread('C:
\111.jpg');
subplot(1,2,1),imshow(I);
J=rgb2gray(I);
J=double(J);
[Gx,Gy]=gradient(J);
G=sqrt(Gx.*Gx+Gy.*Gy);
J1=G;
subplot(1,2,2),imshow(J1);
灰度变换处理:
functionhuidubianhuan
I=imread('C:
\111.jpg');
imshow(I);
M=rgb2gray(I);
figure,imhist(M);
J=imadjust(M,[0.150.9],[01]);
figure,imshow(J);
figure,imhist(J);
图像复原处理:
I=imread('111.jpg');
figure
(1);imshow(I);
len=28;
theta=14;
PSF=fspecial('motion',len,theta);
blurred=imfilter(I,PSF,'circular','conv');
len=28;
theta=14;
wnr1=deconvwnr(blurred,PSF);
figure
(2);imshow(wnr1);
自适应处理:
functionzishiying
[I,map]=imread('C:
\111.jpg');
K=rgb2gray(I);
subplot(1,2,1),imshow(I);
J1=imnoise(K,'gaussian',0,0.02);
[Hnoise]=wiener2(J1);
subplot(1,2,2),imshow(H);
4.4图像处理实现过程
建立好界面后,需要VC++调用MATLAB引擎函数实现信号处理。
1)设置系统环境变量path,path里面要包括MATLAB的exe。
双击path,变量设为C:
\MATLAB7\bin;C:
\MATLAB7\bin\win32
2)设置VC路径
运行VC,转到optionsinclude增加MATLAB的include路径:
C:
\MATLAB7\EXTERN\INCLUDE\LIB和C:
\MATLAB7\EXTERN\LIB\WIN32\MICROSOFT
3)在VX中新建一个console项目,项目的link输入增加libmx.liblibmat.liblibmex.liblibeng.lib。
一般的经历这三步后,基本就能成功运行利用该编辑窗口编辑的代码了。
我们也是在完成以上三步后,完善的界面设计和引擎函数调用编程。
具体步骤如下:
引擎程序可以在Matlab环境下编译和连接,也可以在VisualC++6.0的DE中编译和连接,下面阐述具体实现步骤。
在VC++6.0中调用Matlab引擎下首先要进行环境设置如下[9]:
(1)使用菜单Tools/Options设置属性页,进入Directories页面,选择Showdirectoriesfor下拉框中的Includefiles,加入路径(假定Matlab安装在C盘下):
C:
\matlab\extern\include
C:
\matlab\extern\include\cpp
(2)选择libraryfiles,加入如下路径:
C:
\matlab\extern\lib\win32\Microsoft\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 数字图像