毕业论文-Matlab与C混合编程的方法研究与实现.doc_第1页
毕业论文-Matlab与C混合编程的方法研究与实现.doc_第2页
毕业论文-Matlab与C混合编程的方法研究与实现.doc_第3页
毕业论文-Matlab与C混合编程的方法研究与实现.doc_第4页
毕业论文-Matlab与C混合编程的方法研究与实现.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Matlab与C混合编程的方法研究与实现摘要:文章探讨了MATLAB与VC+的优缺点,介绍了VC+与Matlab混合编程的几种方法。通过二者的结合,既有效地利用了MATLAB强大的数值计算能力和众多的函数,大大减少程序设计的工作量,又继承了VC+良好的程序界面,证明是一种很好的程序设计方法。具体说明了如何应用Matlab引擎实现混合编程以及如何利用MATCOM进行MATLAB和VC+混合编程,并将两种方法用于数字图像处理。关键词:MATLAB;VC+;MATCOM;引擎;混合编程;图像处理一、引言1、数字图像处理简介:图像技术由高到低分为三个层次:图像处理、图像分析和图像理解。图像处理是比较底层的操作,它主要在图像像素级上进行处理,处理的数据量非常大。数字图像处理最基本的目的就是改善图像,主要是按需要进行适当的变换突出某些有用的信息,去除或消弱无用的信息,如改变图像的对比度,去除噪声或强调边缘的处理等,其基本方法有:直方图修正、灰度变换、图像的频域特性、图像平滑、图像锐化等。直方图是图像的重要统计特征,是表示数字图像中每一灰度级与该灰度级出现的频率数间的统计关系。直方图能给出该图像的大致描述,如灰度范围、灰度级的分布、整幅图像的平均亮度等,但它不能完整地描述一幅图像。通常用横坐标表示灰度级,纵坐标表示频数。通常一幅均匀量化的自然图像由于其灰度直方图分布集中在较窄的低值灰度区间,引起图像的细节看不清楚,为使图像变得清晰,我们可以通过变换使图像的灰度范围拉开或使灰度分布在动态范围内趋于均匀化,从而增加反差,使图像的细节清晰,达到图像增强的目的。灰度变换是图像增强的一种重要手段,它可以使图像动态范围加大,使图像对比度扩展,图像更加清晰,特征更加明显。灰度变换可分为线性、分段线性、非线性以及其他的灰度变换。线性灰度变换实际上使曝光不充分的图像中黑的部分更黑,白的部分更白,从而提高对比度。图像中的边缘或者线条部分与图像频谱中的高频成分相对应,因此采用高通滤波的方法让高频分量顺利通过,使低频分量受到抑制,就可以增强高频的成分,使图像的边缘或者线条变得清晰,实现图像的锐化。图像的平滑主要目的是减少图像噪声,减少噪声的方法可以在空间域或者在频率域处理,即:在空间域中进行时,其基本方法是求像素的平均值或者中值;在频率域中则运用低通滤波技术。低通滤波,图像的噪声频谱一般位于空间频率较高的区域,而图像本身的频率分量则处于空间频率较低的区域内,因此可以通过低通滤波的方法,使高频成分受到抑制,而使低频成分顺利通过,从而实现图像的平滑。2、混合编程在图像处理方面的应用Matlab是一种应用广泛的编程工具,语法简单函数丰富,具有优秀的图形显示功能及强大的人机交互能力。Matlab在图象处理方面更有着明显的优势:(a)它具有强大的矩阵运算功能,在进行一些简单的图象变换时可以避免很多烦琐的计算;(b)图形显示方便,有专门的灰度及彩色图象显示函数,甚至在调试过程中也能随时观察图形的变化;(c)带有丰富的图象处理函数库,如wavelet toolbox、image processing toolbox 等。然而由于图象处理的针对性很强,而被处理的对象又千变万化,不可避免地在用Matlab 编程时会遇到一些其自带函数无法处理的问题,只能自己编程解决。这时便会遇到运算速度慢的问题,这是因为Matlab 是一种解释性的编程语言,对程序读一句执行一句,虽然可以很方便地实现编程过程中的交互,但在执行时速度慢也根源于此,这一问题在程序做循环运算时显得尤为严重。C是Windows平台下主要的应用程序开发环境之一,它是一种面向对象的可视化编程语言,广泛用于图形与图像、网络与通信以及控制等领域。能方便实现软件开发,开发的程序文件小、执行速度快、实时性好,开发的系统具有接口友好、易维护和升级等优点。它已成为操作系统、设备驱动程序和系统级平台类软件的最佳开发工具。但缺乏对大量数据处理与分析、数据可视化方面的能力。在工程计算方面,和Matlab相比编程显得复杂的多。如上所述,Matlab的优点在于图像处理方面,而C的优点在于可视化界面的编程。由于C与Matlab的各自特点,因此在Windows环境下实现两者的混合编程将是一种极为强大的编程手段,更加有效地发挥C与Matlab各自的优点,提高软件开发效率,使所开发的软件具有更高的性能,更大的应用范围,也可以为科学研究和工程技术提供更强的技术支持。本文将通过Matlab与C的混合编程实现上述数字图像处理的基本工作。二、几种混合编程方式简介Matlab和C混合编程的思路:在C的集成开发环境下使用Matlab,可以利用Matlab的数学库将Matlab的程序编译为C编译器所能识别的源代码嵌入C的环境。也可用C的语法在C的环境里直接编写程序。不过,Matlab的数学库在开发时似乎倾向于编译独立的可执行程序,把C只作为一个编译和连接的工具,而没有过多地考虑在C的集成环境下进行开发。这给混合编程带来了很大的不便。Matlab与C混合编程大概有如下四种方法:(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的环境运行,程序没有被编译,只是解释运行所以运行速度较慢,但在一些特别的应用(例如需要进行三维图形显示)时可以考虑使用;(2)用Matlab自带的mcc编译器将相应的.m文件转换为cpp代码,转换的代码可读性不太好,不能调用Matlab工具箱中的函数,且不支持图形函数,不常使用,但该方法是Matlab自身提供的,较为方便;(3)编写mex程序可在Matlab中实现对C代码的调用,当程序有多个模块时,需要多次使用mex命令,操作很麻烦;(4)用Matcom进行转换非常简单、方便,生成的代码可读性很好,且在C编译器编译后其代码的执行的速度比Matlab下平均要快1.5倍以上,可以认为是Matlab和C进行混合编程最为有效的途径。本次课题笔者主要用了第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内核的C+编译器,它可以生成C-MEX独立应用程序,是Mideva的核心。本文以下将二者统一写作Matcom。Matcom包含了一组称为MatrixLIB的C+库,它是MATHTOOLS公司开发的一个矩阵数学库,提供了一个双精度Matrix类型Mm。这个库提供了绝大多数的关于矩阵类、矩阵操作函数、数值计算函数、数学函数等的定义,在Matcom中是以lib目录下的*.lib以及windows/system/对应名称的dll文件提供的。Matcom的另一大部分就是图形部分,它是用一种非常流行的绘图OCX控件Teechart来实现的,这种控件对于一般的绘图功能都可以实现,但也存在一定缺陷。在Matcom4.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实现,但有些由于其功能有限,只能期待以后的版本来不断补充了。总的来说,Matcom有以下缺欠:(1)对class数据类型部分支持(2)eval,feval,clear等语句不能在C中实现(如果实现的话,一个文本编辑器就可以成为一个Matlab了)(3)图形窗口有些不尽如人意,如fill3,hide等语句无法实现,surf等语句也无法画出象Matlab中哪样精细的图像来,特别是色彩比较难看等等 2、混合编程的实现(1)通过外壳函数调用Matcom可将m文件转换为exe文件,实现一种简单的混合编程方式。具体方法是利用外壳函数WinExec()或ShellExecute()直接调用exe文件。本次课题主要运用了函数WinExec(),其原型是:UINT WinExec( LPCSTR lpCmdLine, /adress of command line UINT nCmdShow /window style for new application);其中,lpCmdLine为包含命令行参数的字符串,nCmdShow用来控制窗口状态,常见的如SW_SHOW,SW_SHOWMAXIMIZED和SW_SHOWMINIMIZED等。通过外壳函数直接调用exe文件的方法,实现简单,且无需链接头文件和库,但一般在程序中不能接收返回值,灵活性差。(2)运用MatrixLIB通过Matcom自动地将m文件转换为C、CPP文件,然后将C、CPP代码拷贝到Visual C+工程中,从而实现混合编程。这种方法的重点在于调用Matcom的MatrixLIB C+ 库函数之前要用语句initM(MATCOM- VERSION)初始化类库调用,并在调用结束时用语句exitM()结束对类库的调用。在MFC工程文件中,一般是在一个类(如CDipDoc)的构造函数中添加initM(MATCOM-VERSION)以完成类库的初始化工作,在该类的构造函数中添加exitM()结束对类库的调用。下面通过本次课题来具体说明上述两种方法a.编程环境设置:Matcom在安装时会提示选取c/c+编辑器,还需要指定Matlab,主要是为了编译文件中需要的一些系统函数来找到路径用的。Matcom提供了易于使用的接口,可直接通过菜单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。步骤二:添加库文件。通过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:N2d=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(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(); #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 /转换数据矩阵 #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/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_ditong_i1+) forelem(j_,j_ditong_v1,j_ditong_i1); #line 17 c:/Matlab6p5/work/ditong.m_ d = msqrt(mpower(i_-n1),2.0)+mpower(j_-n2),2.0); #line 18 c:/Matlab6p5/work/ditong.m_ h = 1.0/(1.0+0.414*mpower(d/d0),(2.0*n); #line 19 c:/Matlab6p5/work/ditong.m /计算Butterworth低通转换函数 #line 20 c:/Matlab6p5/work/ditong.m_ result(i_,j_) = h*g(i_,j_); #line 21 c:/Matlab6p5/work/ditong.m #line 22 c:/Matlab6p5/work/ditong.m #line 23 c:/Matlab6p5/work/ditong.m_ result = ifftshift(result); #line 24 c:/Matlab6p5/work/ditong.m_ X2 = ifft2(result); #line 25 c:/Matlab6p5/work/ditong.m_ X3 = muint8(real(X2); #line 26 c:/Matlab6p5/work/ditong.m_ display(figure(); #line 26 c:/Matlab6p5/work/ditong.m_ display( imshow(CL(X3) );call_stack_end;注意:如果要转化的m文件中调用了其他的m文件,则把要转化的m文件拷贝到要调用的m文件所在目录进行转化(例如要用到图像处理工具箱里的函数,就拷贝到Matlab6p5toolboximagesimages里)。并且要把生成的相应的所有cpp和h文件添加到工程中。并在相应的cpp文件头添加相应的h头文件和stdafx.h文件。仔细对照ditong.m与生成的ditong. CPP代码,可以发现他们特别类似,基本上是句句对应。步骤三:建立Visual C+工程选择MFC AppWizard(exe),工程名为MidevaTest。在step1选择建立Single Document,其余各项均采用默认设置,点击“Finish”。然后进行以下几步操作:设置好环境后,添加以下菜单项,菜单项属性设置见表3-1,并在视图类添加相应的事件响应函数。表3-1 菜单项的属性设置CaptionIDPromptCPP调用ID_MIDEVA_CPP调用Matcom生成的CPPEXE调用ID_MIDEVA_EXE通过外壳函数调用Matcom生成的EXE在MidevaTestView.cpp开始部分添加#include”matlib.h”,以将头文件包含到工程中。在void CmidevaTestView:OnMidevaCpp()函数中先添加initM(MATCOM- VERSION)初始化类库调用,然后将ditong.m函数经MATCOM自动转换生成的cpp文件中的所有语句拷贝过来,最后添加语句exitM()结束对类库的调用。将MATCOM转换生成的ditong. Exe复制到本工程的目录下。将准备处理的图像原文件复制到本工程目录下。在void CmidevaTestView:OnMidevaCpp()函数中添加以下语句:WinExec(“ditong,exe”,SH_SHOW);以下是新添加菜单的响应事件代码void CMidevaTestView:OnMidevaCpp() initM(MATCOM_VERSION); #line 1 c:/Matlab6p5/work/ditong.m /% 5-3-1 Buterworth低通滤波器实现例程如下: dMm(I1); dMm(f); dMm(g); dMm(N1); dMm(N2); dMm(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(); #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 /转换数据矩阵 #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/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_ditong_i1+) forelem(j_,j_ditong_v1,j_ditong_i1); #line 17 c:/Matlab6p5/work/ditong.m_ d = msqrt(mpower(i_-n1),2.0)+mpower(j_-n2),2.0); #line 18 c:/Matlab6p5/work/ditong.m_ h = 1.0/(1.0+0.414*mpower(d/d0),(2.0*n); #line 19 c:/Matlab6p5/work/ditong.m /计算Butterworth低通转换函数 #line 20 c:/Matlab6p5/work/ditong.m_ result(i_,j_) = h*g(i_,j_); #line 21 c:/Matlab6p5/work/ditong.m #line 22 c:/Matlab6p5/work/ditong.m #line 23 c:/Matlab6p5/work/ditong.m_ result = ifftshift(result); #line 24 c:/Matlab6p5/work/ditong.m_ X2 = ifft2(result); #line 25 c:/Matlab6p5/work/ditong.m_ X3 = muint8(real(X2); #line 26 c:/Matlab6p5/work/ditong.m_ display(figure(); #line 26 c:/Matlab6p5/work/ditong.m_ display( imshow(CL(X3) ); call_stack_end; exitM();void CMidevaTestView:OnMidevaExe() WinExec(ditong.exe,SW_SHOW);编译后运行,在运行界面中分别单击“CPP调用”和“EXE调用”,结果相同,如图1-1、1-2。唯一的差别在于“EXE调用”时会闪出一个DOS窗口,它与直接双击ditong.exe文件的执行效果完全一样。 图1-1 原图像 图1-2 低通滤波后图像尽管没有选择有噪声的图像,但由上图仍旧可以看出通过低通滤波器达到了比较明显的图像平滑效果(平滑的目的可分为两类:一类是模糊,目的是在提取较大的目标前去除太小的细节或将目标内的小间断连接起来;另一类是消除噪声)图像的直方图显示与均衡、灰度变换与高通滤波Matcom混合编程的实现基本思想与低通滤波的相似在此就不再赘述,具体程序及执行结果见附录。3、程序的发布 混合编程后生成的MFC可执行文件可脱离Matlab与vc系统独立运行,但需要一些必要的dll文件,有ago4501.dll,v4501v.dll,MFC42D.DLL,MFC042D.DLL,MSVCRTD.DLL以及用到的图像、调用到的由MATCOM直接编译生成的EXE文件此外还有一种不会用到vc系统的混合编程方法简单介绍如下:利用Matcom可以生成不需要Matlab环境支持的exe文件,直接利用Matcom菜单file/compile to exe/,然后选择要生成的m文件,便会自动完成m文件的编译与连接。编译完后就可以在debug目录中找到与m文件同名的exe文件。该文件在脱离Matlab环境运行时需加入ago4501.dll,v4501v.dll两个dll文件。四、引擎1、MATLAB引擎简介Matlab引擎是Matlab提供的一系列程序的结合,它允许用户在自己的应用程序中对Matlab进行调用,将Matlab作为一个操作引擎使用,使其在后台运行。一般Matlab 引擎采用客户机/ 服务器(Client/ Sever) 计算方式,就是一种把应用处理负载分布到客户机和服务器上的一种计算模式,客户机和服务器既可以是存在于同一台计算机,也可以通过网络来实现信息共享。一般情况下,客户机是运行前端软件的PC机,并且知道如何与服务器通信,服务器与此相对应,是接收请求信息,并采取相应行的机器。由于客户机和服务器共同承担处理负载使系统总体性能大为提高。在实际应用过程中,把VC的C语言或C + + 语言的程序作为前端客户机程序,它从Matlab 引擎接收数据信息,并与引擎传递命令的数据信息。下面是几个常用的Matlab API函数:EngOpen:开启Matlab引擎;Engclose:关闭Matlab引擎;EngGetArray:从Matlab Engine中获得一个Matlab矩阵,用于数据交换;EngEvalString:在Maflab引擎中执行输入的Matlab命令;EngPutVariable:从应用程序向Matlab引擎发送一个Matlab矩阵(mxArray类型);EngOutputBufer:创建字符缓冲区以获取Matlab文本输出它们的声明放在engineh中。通过Matlab引擎用户可以完成以下任务:首先,可以将Matlab作为一个功能强大的和可编程的数学函数库,调用Matlab中的大量的数学计算函数,完成复杂的计算任务;其次,可以为一个特定的任务构建一个完整的系统,前台的用户界面用高级语言编写,后台的计算任务由Matlab引擎来完成;最后,用户不但可以在本地计算机上调用Matlab引擎,而且还可以通过网络调用其它计算机上的Matlab引擎,这样可以很好的实现资源的共享和作业的分工合作。2、Matlab引擎实现VC和Matlab混合编程的步骤要想在VC集成环境下利用Matlab引擎实现VC和Matlab的混合编程,一般需要经过以下几个必要的步骤:(1)Visual C+6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C+6.0设置属性页,进入 Directorie页面,在 Show Directories for下拉列表中选择Include Files,添加路径:C:Matlab6p5externinclude(在Matlab的安装路径下);再选择下拉列表中的 Library Files,添加路径:c:Matlab6p5extern libwin32Microsoftmsvc60(在Matlab的安装路径下)。编译环境只需设置一次。(2)添加库文件: 通过菜单 Projects|settings,进入 Link 页面,在 Object/Library Modules 框中,添加库文件名:libmx.lib 、libmat.lib 、libeng.lib。每个新的工程文件都要单独添加库文件。(3)在使用 engine 函数的程序头文件中包含如下两个头文件:#include engine.h#include stdlib.h (4)在应用程序中添加调用Matlab引擎的程序代码: Engine *ep;if(!(ep=engOpen( 0) /打开Matlab引擎,建立与本地Matlab的连接fprintf(stderr,n Cant start MATLAB enginen);exit(-1); 以上步骤是对VC与Matlab混合编程的编译环境进行设置,在完成了以上基本步骤后就可以利用Matlab引擎库函数engEvalString来调用Matlab的内建函数了。这里举一个利用上述Matlab引擎混合编程实现图像直方图显示并均衡的例子。新建一个MFC AppWizard(exe)类型工程,工程名为Dip,将CdipView类的基类改为“CscrollView”以支持视图滚动,其余各项均采用默认值,创建完毕后按照上述步骤设置环境。编程环境设置好以后在IDR_DIPTYPE菜单资源的View菜单下添加ID_VIEW_HISTMATLAB菜单,利用ClassWizard在类Cdipdoc添加响应函数,代码如下:void CDipDoc:OnViewHistMatlab() Engine *ep;/定义MATLAB引擎变量 CString command; if(!(ep=engOpen(0)/打开MATLAB引擎 fprintf(stderr,n MATLAB引擎启动失败!n); MessageBox(NULL,MATLAB引擎启动失败!,MATLAB,MB_OK |MB_ICONERROR); exit(-1); CString strPathName=GetPathName();/实现MATLAB命令 command=data=imread(+strPathName+);/通过MATLAB引擎执行MATLAB命令 engEvalString(ep,command); engEvalString(ep,figure(2),subplot(2,2,1),imshow(data),title(原图像); engEvalString(ep,figure(2),subplot(2,2,2),imhist(data),title(原图像直方图统计); engEvalString(ep,figure(2),subplot(2,2,3),k=histeq(data),imshow(k),title(均衡后图像); engEvalString(ep,figure(2),subplot(2,2,4),imhist(k),title(均衡后图像直方图统计); MessageBox(NULL,关闭引擎,系统将退出应用程序!,MATLAB,MB_OK |MB_ICONINFORMATION); engClose(ep); /关闭MATLAB引擎,退出MATLAB编译整个项目文件,运行生成的EXE文件。通过“File”菜单下的“Open”子菜单,打开miss.bmp图像文件,然后在菜单“View”下选择“直方图”子菜单,程序将调用引擎进行原是图像的现实及图像的直方图统计,结果如图2-3图2-3 利用引擎混合编程均衡前后图像及直方图对比由上图可以看出均衡化后原图像中较暗区域中的一些细节更清晰,直方图中灰度值分布更加均匀,整个图像的对比度明显增强。图像的加噪降噪利用引擎混合编程的实现基本思想与低通滤波的相似在此就不再赘述,具体程序及执行结果见附录。五、性能对比表2是分别利用Matlab和混合编程实现图像直方图的显示与均衡的运行效率的对比。由于整个程序比较简单,而且用到的循环处理相当少,从而对Matlab函数的循环调用就比较少,所以无法非常明显的表现出混合编程的优势。相信在处理较复杂问题时,混合编程的优势将会非常明显的表现出来。运行环境:Matlab6.5 ,Matcom4.5, V C+ + 6.0 ,WindowsXP. 表2 运行效率对比表编程方式Matlab混合编程引擎Matcom执行时间约2.0930秒约2.056秒约1.641秒由表2可以看出,引擎方式的运行速度比Matlab有了一定的改善,这是因为整个处理过程除去对Matlab函数的调用部分,其它功能均由VC+实现,很大程度上避免了Matlab由其解释性语言而造成处理For循环时速度级慢的问题。但是,由于处理过程中与Matlab频繁的通讯,又导致其运行效率远远低于Matcom方式。由此可见,引擎方式实现混合编程不适用于有实时性要求的处理,处理过程中vC+和Matlab的频繁通讯是制约其运行效率的根本原因。Matcom 方式由于完全脱离了Matlab运行环境,其执行速度得到了根本的改善,能够满足有一定实时性要求的处理。但Matcom仅支持部分class数据类型,有些语句在C+中也不能实现,因而并不是对Matlab中所有的函数都可以实现转换,这些缺陷又限制了它的应用范围。六、总结 本文介绍了Matlab引擎和Matcom两种实现混合编程的方法,通过两种方法的综合运用,既能够充分利用Matlab功能强大的函数库,弥补了VC+数值分析、信号处理等方面的不足,又保留了VC+编程灵活的特点,改进了单独使用Matlab造成的执行速度过慢的缺陷,降低了开发的难度,提高了编程效率。文中介绍的两种方法各有其优缺点:通过Matlab engine实现混合编程,能够充分利用Matlab丰富的库函数,但需在后台运行Matlab,不能脱离Matlab环境;利用Matcom实现混合编程则可以完全脱离Matlab环境,代码执行效率高,但不支持Matlab的部分图形函数。在图像处理过程中,混合编程的方法,可以简化图像处理操作,对我们开发图像处理系统有很高的实用意义,为软件开发提供了强有力的技术支持。参考文献1(美)冈萨雷斯等,数字图像处理(第二版)中文版,阮秋琦等译,北京:电子工业出版社,20052张志涌,精通MATLAB6.5版,北京:北京航空航天大学出版社,20033杨高波,精通MATLAB7.0混合编程,北京:电子工业出版社,20064郑阿奇,Visual C+实用教程,北京:电子工业出版社,20045董维国,深入浅出MATLAB7.X混合编程,北京:机械工业出版社,20066刘维,精通MATLAB与C/C+混合程序设计,北京:北京航空航天大学出版社,2005导师点评王宏伟同学毕业设计的任务是研究Matlab与Visual C+混合编程的各种实现方法,并将其应用于数字图像处理中。Matlab与Visual C+是目前数字图像处理中应用广泛的两种程序设计语言,各有其优缺点,通过混合编程,扬长避短,为数字图像处理提供了更强大的工具。该同学在接到课题设计任务后,态度十分积极主动,能利用考研复习和寒假的空闲时间消化相关的资料及文档。这学期正式进入设计任务后,能严格按照教员制定的步骤完成设计任务。当在设计中遇到问题时,也能够做到利用以往所学及现有资料自己钻研,而不是一味依赖教员解决。同时在整个设计任务中也能够按照教员的要求,培养自己从事科研项目的一些良好的习惯。通过和教员很好的配合,最后顺利完成了毕业设计,达到了当初下达毕业设计任务的目的。论文结构合理,思路清晰,文字表述流畅。论文工作表明该同学具备较强的自学能力与科研工作能力。附录1、 图像的高通滤波Matcom混合编程的实现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=5;n1=fix(N1/2);n2=fix(N2/2);for i=1:N1for j=1:N2d=sqrt(i-n1)2+(j-n2)2);if d=0h=0;elseh=1/(1+(d0/d)(2*n);endresult(i,j)=h*g(i,j);endendresult=ifftshift(result);X2=ifft2(result);X3=uint8(real(X2);figure,imshow(X3)转换后的cpp代码: dMm(I1); dMm(f); dMm(g); dMm(N1); dMm(N2); dMm(n); dMm(d0); dMm(n1); dMm(n2); dMm(i_); dMm(i_gaotong_v0); dMm(j_) ; dMm(j_gaotong_v1); dMm(d); dMm(h); dMm(result); dMm(X2); dMm(X3); #line 3 c:/Matlab6p5/work/gaotong.m call_stack_begin; #line 3 c:/Matlab6p5/work/gaotong.m_ I1 = imread(TM(miss.bmp); #line 4 c:/Matlab6p5/work/gaotong.m_ display(figure(); #line 4 c:/Matlab6p5/work/gaotong.m_ imshow(CL(I1),nop_M); #line 5 c:/Matlab6p5/work/gaotong.m_ f = mdouble(I1); #line 6 c:/Matlab6p5/work/gaotong.m_ g = fft2(f); #line 7 c:/Matlab6p5/work/gaotong.m_ g = fftshift(g); #line 8 c:/Matlab6p5/work/gaotong.m_ /*N1,N2 = */size(g,i_o,N1,N2); #line 9 c:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论