Matlab与C混合编程的方法研究与实现毕业论文.doc
《Matlab与C混合编程的方法研究与实现毕业论文.doc》由会员分享,可在线阅读,更多相关《Matlab与C混合编程的方法研究与实现毕业论文.doc(25页珍藏版)》请在三一办公上搜索。
1、Matlab与C混合编程的方法研究与实现摘要:文章探讨了MATLAB与VC+的优缺点,介绍了VC+与Matlab混合编程的几种方法。通过二者的结合,既有效地利用了MATLAB强大的数值计算能力和众多的函数,大大减少程序设计的工作量,又继承了VC+良好的程序界面,证明是一种很好的程序设计方法。具体说明了如何应用Matlab引擎实现混合编程以及如何利用MATCOM进行MATLAB和VC+混合编程,并将两种方法用于数字图像处理。关键词:MATLAB;VC+;MATCOM;引擎;混合编程;图像处理一、引言1、数字图像处理简介:图像技术由高到低分为三个层次:图像处理、图像分析和图像理解。图像处理是比较底
2、层的操作,它主要在图像像素级上进行处理,处理的数据量非常大。数字图像处理最基本的目的就是改善图像,主要是按需要进行适当的变换突出某些有用的信息,去除或消弱无用的信息,如改变图像的对比度,去除噪声或强调边缘的处理等,其基本方法有:直方图修正、灰度变换、图像的频域特性、图像平滑、图像锐化等。直方图是图像的重要统计特征,是表示数字图像中每一灰度级与该灰度级出现的频率数间的统计关系。直方图能给出该图像的大致描述,如灰度范围、灰度级的分布、整幅图像的平均亮度等,但它不能完整地描述一幅图像。通常用横坐标表示灰度级,纵坐标表示频数。通常一幅均匀量化的自然图像由于其灰度直方图分布集中在较窄的低值灰度区间,引起
3、图像的细节看不清楚,为使图像变得清晰,我们可以通过变换使图像的灰度范围拉开或使灰度分布在动态范围内趋于均匀化,从而增加反差,使图像的细节清晰,达到图像增强的目的。灰度变换是图像增强的一种重要手段,它可以使图像动态范围加大,使图像对比度扩展,图像更加清晰,特征更加明显。灰度变换可分为线性、分段线性、非线性以及其他的灰度变换。线性灰度变换实际上使曝光不充分的图像中黑的部分更黑,白的部分更白,从而提高对比度。图像中的边缘或者线条部分与图像频谱中的高频成分相对应,因此采用高通滤波的方法让高频分量顺利通过,使低频分量受到抑制,就可以增强高频的成分,使图像的边缘或者线条变得清晰,实现图像的锐化。图像的平滑
4、主要目的是减少图像噪声,减少噪声的方法可以在空间域或者在频率域处理,即:在空间域中进行时,其基本方法是求像素的平均值或者中值;在频率域中则运用低通滤波技术。低通滤波,图像的噪声频谱一般位于空间频率较高的区域,而图像本身的频率分量则处于空间频率较低的区域内,因此可以通过低通滤波的方法,使高频成分受到抑制,而使低频成分顺利通过,从而实现图像的平滑。2、混合编程在图像处理方面的应用Matlab是一种应用广泛的编程工具,语法简单函数丰富,具有优秀的图形显示功能及强大的人机交互能力。Matlab在图象处理方面更有着明显的优势:(a)它具有强大的矩阵运算功能,在进行一些简单的图象变换时可以避免很多烦琐的计
5、算;(b)图形显示方便,有专门的灰度及彩色图象显示函数,甚至在调试过程中也能随时观察图形的变化;(c)带有丰富的图象处理函数库,如wavelet toolbox、image processing toolbox 等。然而由于图象处理的针对性很强,而被处理的对象又千变万化,不可避免地在用Matlab 编程时会遇到一些其自带函数无法处理的问题,只能自己编程解决。这时便会遇到运算速度慢的问题,这是因为Matlab 是一种解释性的编程语言,对程序读一句执行一句,虽然可以很方便地实现编程过程中的交互,但在执行时速度慢也根源于此,这一问题在程序做循环运算时显得尤为严重。C是Windows平台下主要的应用程
6、序开发环境之一,它是一种面向对象的可视化编程语言,广泛用于图形与图像、网络与通信以及控制等领域。能方便实现软件开发,开发的程序文件小、执行速度快、实时性好,开发的系统具有接口友好、易维护和升级等优点。它已成为操作系统、设备驱动程序和系统级平台类软件的最佳开发工具。但缺乏对大量数据处理与分析、数据可视化方面的能力。在工程计算方面,和Matlab相比编程显得复杂的多。如上所述,Matlab的优点在于图像处理方面,而C的优点在于可视化界面的编程。由于C与Matlab的各自特点,因此在Windows环境下实现两者的混合编程将是一种极为强大的编程手段,更加有效地发挥C与Matlab各自的优点,提高软件开
7、发效率,使所开发的软件具有更高的性能,更大的应用范围,也可以为科学研究和工程技术提供更强的技术支持。本文将通过Matlab与C的混合编程实现上述数字图像处理的基本工作。二、几种混合编程方式简介Matlab和C混合编程的思路:在C的集成开发环境下使用Matlab,可以利用Matlab的数学库将Matlab的程序编译为C编译器所能识别的源代码嵌入C的环境。也可用C的语法在C的环境里直接编写程序。不过,Matlab的数学库在开发时似乎倾向于编译独立的可执行程序,把C只作为一个编译和连接的工具,而没有过多地考虑在C的集成环境下进行开发。这给混合编程带来了很大的不便。Matlab与C混合编程大概有如下四
8、种方法:(1)利用Matlab引擎来实现,它允许用户在用其它软件编写的应用程序中对Matlab中的数学运算工具函数进行调用;(2)用Matlab的mcc将.m 文件翻译为cpp 源文件,然后在C编译器中调用,也可以用mcc编译为exe文件,使用C的外部函数进行调用;(3)运用mex文件使Matlab直接调用C编写的算法;(4)用Matcom将.m 文件翻译为cpp代码,并编译为exe或dll文件。Matlab和C的4种混合编程方法的优缺点:(1)利用Matlab引擎可节省大量的系统资源,应用程序整体性能较好,能最充分地利用Matlab的功能,但不可脱离Matlab的环境运行,程序没有被编译,只
9、是解释运行所以运行速度较慢,但在一些特别的应用(例如需要进行三维图形显示)时可以考虑使用;(2)用Matlab自带的mcc编译器将相应的.m文件转换为cpp代码,转换的代码可读性不太好,不能调用Matlab工具箱中的函数,且不支持图形函数,不常使用,但该方法是Matlab自身提供的,较为方便;(3)编写mex程序可在Matlab中实现对C代码的调用,当程序有多个模块时,需要多次使用mex命令,操作很麻烦;(4)用Matcom进行转换非常简单、方便,生成的代码可读性很好,且在C编译器编译后其代码的执行的速度比Matlab下平均要快1.5倍以上,可以认为是Matlab和C进行混合编程最为有效的途径
10、。本次课题笔者主要用了第4种方实现了图像的大部分预处理,由于Matcom无法对Matlab函数中的eval,feval,clear等语句实现C的编译,所以涉及到类似情况的处理运用了引擎的方法,具体见下文。(函数句柄演算函数feval在Matcom编译中不能通过,导致大部分图像处理函数不能通过编译)运行环境:Matlab6.5,Matcom4.5, Visual C+6.0,WindowsXP.三、Matcom下面将详细介绍一下利用MATCOM进行MATLAB和VC+混合编程,并用于图像的直方图显示与均衡、灰度变换、低通与高通的滤波。1. Matcom的工作原理 Matcom实际上是Mideva
11、内核的C+编译器,它可以生成C-MEX独立应用程序,是Mideva的核心。本文以下将二者统一写作Matcom。Matcom包含了一组称为Matrix的C+库,它是MATHTOOLS公司开发的一个矩阵数学库,提供了一个双精度Matrix类型Mm。这个库提供了绝大多数的关于矩阵类、矩阵操作函数、数值计算函数、数学函数等的定义,在Matcom中是以lib目录下的*.lib以及windows/system/对应名称的dll文件提供的。Matcom的另一大部分就是图形部分,它是用一种非常流行的绘图OCX控件Teechart来实现的,这种控件对于一般的绘图功能都可以实现,但也存在一定缺陷。在Matcom4
12、.5版本中使用的是TeeChart3.0。绘图函数功能主要在lib文件和window/system/ago*.dll中定义的。Matcom编译.m文件是先将.m文件按照与Matcom的Cpp库的对应关系,翻译为CPP源代码,然后用对应版本的C编译器将该CPP文件编译为exe或dll文件,所以,在第一次运行时 让指定C Complier的路径是必需的,否则将无法编译。指定好的C Complier的信息写在 Matcom/bin/Matcom.ini文件中。 Matcom并不是全能的,对于大多数Matlab函数都可以进行CPP实现,但有些由于其功能有限,只能期待以后的版本来不断补充了。总的来说,M
13、atcom有以下缺欠:(1)对class数据类型部分支持(2)eval,feval,clear等语句不能在C中实现(如果实现的话,一个文本编辑器就可以成为一个Matlab了)(3)图形窗口有些不尽如人意,如fill3,hide等语句无法实现,surf等语句也无法画出象Matlab中哪样精细的图像来,特别是色彩比较难看等等 2、混合编程的实现(1)通过外壳函数调用Matcom可将m文件转换为exe文件,实现一种简单的混合编程方式。具体方法是利用外壳函数WinExec()或ShellExecute()直接调用exe文件。本次课题主要运用了函数WinExec(),其原型是:UINT WinExec(
14、 LPCSTR lpCmdLine, /adress of command line UINT nCmdShow /window style for new application);其中,lpCmdLine为包含命令行参数的字符串,nCmdShow用来控制窗口状态,常见的如SW_SHOW,SW_SHOWMAXIMIZED和SW_SHOWMINIMIZED等。通过外壳函数直接调用exe文件的方法,实现简单,且无需链接头文件和库,但一般在程序中不能接收返回值,灵活性差。(2)运用Matrix通过Matcom自动地将m文件转换为C、CPP文件,然后将C、CPP代码拷贝到Visual C+工程中,从
15、而实现混合编程。这种方法的重点在于调用Matcom的Matrix C+ 库函数之前要用语句initM(MATCOM- VERSION)初始化类库调用,并在调用结束时用语句exitM()结束对类库的调用。在MFC工程文件中,一般是在一个类(如CDipDoc)的构造函数中添加initM(MATCOM-VERSION)以完成类库的初始化工作,在该类的构造函数中添加exitM()结束对类库的调用。下面通过本次课题来具体说明上述两种方法a.编程环境设置:Matcom在安装时会提示选取c/c+编辑器,还需要指定Matlab,主要是为了编译文件中需要的一些系统函数来找到路径用的。Matcom提供了易于使用的
16、接口,可直接通过菜单file/compile to exe/将m文件转换成可执行文件,同时自动生成了相应的c/cpp文件。为了Visual C+借助强大的集成调试环境,以便将生成的c/cpp代码添加到Visual C+的工程中,必须先进行必要的设置。主要有以下几步:步骤一:添加头文件。matlib.h是madeva提供的函数的头文件,它位于c:Matcom45lib目录下。方法是通过project-setting菜单,选取c/c+选项卡,在category中选取preprocessor,然后在additional include directory中添加目录c:Matcom45lib。步骤二:
17、添加库文件。通过project-add to project选取files,然后按提示选取c:Matcom45lib目录下的v4501v.lib文件。b.图像的平滑(利用Buterworth低通滤波器)步骤一:编辑m文件如下:Buterworth低通滤波器实现图像的平滑程序如下:I1=imread(miss.bmp);figure,imshow(I1, );f=double(I1);g=fft2(f);%傅立叶变换g=fftshift(g);%转换数据矩阵N1,N2=size(g);n=2;d0=50;n1=fix(N1/2);n2=fix(N2/2);for i=1:N1for j=1:N2
18、d=sqrt(i-n1)2+(j-n2)2);h=1/(1+0.414*(d/d0)(2*n);%计算Butterworth低通转换函数result(i,j)=h*g(i,j);endendresult=ifftshift(result);X2=ifft2(result);X3=uint8(real(X2);figure,imshow(X3)步骤二:通过Matcom菜单file/compile to exe将ditong.m函数转换为exe文件,同时生成CPP文件,打开ditong. CPP,代码如下:dMm(I1); dMm(f); dMm(g); dMm(N1); dMm(N2); dMm
19、(n); dMm(d0); dMm(n1); dMm(n2); dMm(i_); dMm(i_ditong_v0); dMm(j_) ; dMm(j_ditong_v1); dMm(d); dMm(h); dMm(result); dMm(X2); dMm(X3); #line 3 c:/Matlab6p5/work/ditong.m call_stack_begin; #line 3 c:/Matlab6p5/work/ditong.m_ I1 = imread(TM(miss.bmp); #line 4 c:/Matlab6p5/work/ditong.m_ display(figure(
20、); #line 4 c:/Matlab6p5/work/ditong.m_ imshow(CL(I1),nop_M); #line 5 c:/Matlab6p5/work/ditong.m_ f = mdouble(I1); #line 6 c:/Matlab6p5/work/ditong.m_ g = fft2(f); #line 7 c:/Matlab6p5/work/ditong.m /傅立叶变换 #line 8 c:/Matlab6p5/work/ditong.m_ g = fftshift(g); #line 9 c:/Matlab6p5/work/ditong.m /转换数据矩阵
21、 #line 10 c:/Matlab6p5/work/ditong.m_ /*N1,N2 = */size(g,i_o,N1,N2); #line 11 c:/Matlab6p5/work/ditong.m_ n = 2.0; #line 12 c:/Matlab6p5/work/ditong.m_ d0 = 50.0; #line 13 c:/Matlab6p5/work/ditong.m_ n1 = fix(N1/2.0); #line 14 c:/Matlab6p5/work/ditong.m_ n2 = fix(N2/2.0); #line 15 c:/Matlab6p5/work/
22、ditong.m_ i_ditong_v0 = colon(1.0,1.0,N1); int i_ditong_i0; for (i_ditong_i0=0;i_ditong_i0i_ditong_v0.cols();i_ditong_i0+) forelem(i_,i_ditong_v0,i_ditong_i0); #line 16 c:/Matlab6p5/work/ditong.m_ j_ditong_v1 = colon(1.0,1.0,N2); int j_ditong_i1; for (j_ditong_i1=0;j_ditong_i1j_ditong_v1.cols();j_di
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 混合 编程 方法 研究 实现 毕业论文
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-4741692.html