文档库 最新最全的文档下载
当前位置:文档库 › VC++与Matlab混合编程之引擎操作详解.pdf

VC++与Matlab混合编程之引擎操作详解.pdf

VC++与Matlab混合编程之引擎操作详解.pdf
VC++与Matlab混合编程之引擎操作详解.pdf

用VB与MATLAB混合编程方式实现图像处理

任少斌1,李元宗2

1太原理工大学理学院计算机基础教学部,太原 (030024)

2太原理工大学机器人研究所,太原 (030024)

Email: rsb_long@https://www.wendangku.net/doc/552378337.html,

摘 要:阐述了如何使用MATLAB与VB编程工具相结合的手段开发图像处理研究软件的方法。以直方图计算的分析为例,用VB与MATLAB 编写程序,实现对直方图特性变化的分析,并给出可视化的结果。通过一个具体的程序证明VB与MATLAB混合编程可以有效的提高了程序的设计效率。

关键词:VB;MATLAB;DDE;混合编程;图像处理

1 引言

VB(Visual Basic)由Microsoft公司推出并广泛应用的可视化面向对象编程工具,它功能丰富,简单易学,既是一种编程语言,也是一个强大的集成开发环境。利用VB能够迅速编制各种风格而且界面良好的软件,它是目前Windows平台上主力编程语言之一。VB的主要缺点是运算速度慢,不适合进行大型的数值计算和图形处理。

MATLAB是由美国MathWorks公司开发的软件工具,它具有强大的数值运算能力,适用于大量科学与工程计算,具有先进的视觉化功能。在控制系统、图像处理、信号处理、神经网络等方面有应用广泛。但MATLAB的是一个命令式交互系统,功能模块比较分散,要求使用者具有较高的计算机应用素质,并且熟悉MATLAB的环境[1]。

2 混合编程概念引入

C++是一种传统的被公认为可以用于图像处理的程序设计语言,但面对C++编程过于繁琐和抽象的特点,使很多人对使用它进行程序设计敬而远之。而MATLAB利用单独函数功能处理图像处理的优势,VB在交互界面设计中的方便灵活的特点,使人们开始尝试将这两种语言相互结合用于图像处理,即混合编程的概念。MATLAB与VB都是基于Windows环境中的编程平台,其中MABLAB有十分强大的图像处理工具箱,它支持丰富的图像文件格式。它提供的15 类图像处理函数,涵盖了几乎所有的常见图像处理方法[1]。利用这些图像处理工具箱,再结合MA TLAB6.5自身的强大数据处理功能,可以不必关心图像文件的格式、读写、显示等细节,而把精力集中在算法研究上,使得工作效率大大提高。在测试这些算法时既可方便地得到统计数据,同时又可得到直观图示[2],如图3 所示。

VB与MATLAB混合编程的主要思想来自客户机/服务器应用程序开发模式。随着应用程序开发模块化以及互联网的广泛应用,很多软件系统都提供了这种技术支持。MATLAB 和VB同时具备这项功能。实现方式主要有四种。ActiveX方式、使用MatrixVB、调用DLL 动态链接库和DDE方式。四种方法各有特点,在很多文献中都有阐述[3]。其中使用Matrix VB

相对简单,不需要额外调用其他函数和文件,但能够用于图像处理的功能有限; 通过DLL 动态链接库,将MATLAB 的函数转换为VB 中可以调用动态链接库,使用ActiveX方式对于设计人员要求较高相应的难度较大;使用DDE方式主要利用剪贴板功能传递数据,相对容易实现。本文重点介绍使用DDE方式与MATLAB混合编程。

3 动态数据交换DDE(Dynamic Data Exchange)

动态数据交换简单的解释,就是采用的是内存共享方式用于给两个不同的程序做通讯工作。而通讯交换实际上指利用剪贴板在不同应用程序之间传递数据。Windows支持多进程通信机制,包括Windows剪贴板、动态链接库中的共享内存和ActiveX等。其中动态数据交换DDE(Dynamic Data Exchange)属多进程通信机制之一。DDE的功能没有ActiveX强大,但其在使用时比较方便,容易实现[4]的特点。

3.1 DDE传递机理

DDE是基于windows的消息机制,两个Windows程序之间可以通过相互传递消息进行“对话”,这两个程序形象地被称为“服务器”和“客户”(如图1所示)。DDE服务器是一个维护其它Windows程序而使用的数据程序,而DDE客户则是从DDE服务器获得这些数据的程序。在Windows中的应用程序具有双重身份,它既可以是一个程序的客户,也可以是另一个程序的服务器。因此在程序设计中需要明确对话环境,当客户发出相应的消息之后,它同时也说明了需要的服务类型。DDE对话由客户程序发出,客户程序将一条称为WM_DDE_INITIATE的消息发到目前所有运行的Windows程序,它同时指明了客户程序所需要的数据类型,而拥有这些数据的DDE服务器可以响应这条消息并开始对话。混合编程中的DDE在发出对话的指定了需要响应的服务器是MATLAB。因此只有MATLAB会根据对话的要求产生动作。

3.2 DDE工作方式

当一个客户端的应用程序初始化一个DDE对话时,必须指定两个由服务器定义的DDE 参数:服务器应用程序名称 (service name)和对话主题 (topic)。如图2所示。当一个服务器收到一个支持的对话请求后,便接受这个请求,建立一个DDE对话。一个服务器应用程序和一个对话主题共同构成唯一的对话。当MATLAB作为客户程序时,它只支持文本格式的数据传输。它作为服务器时,除支持文本格式外,还可以支持图元文件(MetaFilepict)格式和XLTable格式。本文的数据传递就是基于图元文件格式进行传递的。

3.2.1 客户和服务的交互过程

DDE总是发生在客户应用程序和服务应用程序之间。DDE客户应用程序通过建立和服务程序的会话来发送事务(transaction)来实现数据交换。一个事务是对数据或服务的请求。DDE服务应用程序通过提供数据或服务来响应客户程序的请求。一个服务程序同时可以和

多个客户程序建立会话;一个客户程序也能同时从多个服务程序中获取数据。一个应用程序即可以是客户程序,也可以是服务程序。客户或者服务程序都可以在任意时刻结束已经建立的会话。

3.2.2 服务名、主题名和事务名

DDE服务器使用三层结构(服务名、主题名和数据项名)来唯一地标识一个在会话中被交换的数据单元。其中服务名是一个在客户程序试图同服务器建立会话时服务应用程序用来响应的字符串。为了同服务器建立会话,客户程序必须指定服务名。虽然一个服务器可以响应多个服务名,但是大多数服务器一般只响应一个服务名。主题名是一个用来标识逻辑数据上下文的字符串。对于那些操作基于文件处理的服务器,主题名通常是文件名;其它的则是由应用程序指定的字符串。除了服务名,一个客户程序如果试图建立一个会话,则必须指定主题名。数据项名是一个用来标识服务器传递给客户程序的数据单元的字符串。

3.2.3 系统主题

系统主题提供了一个让任何DDE客户程序得到感兴趣信息的上下文。VB在调用MATLAB时指定服务器主题是Topic。确认由Topic下的数据项对VB的请求产生动作。

3.2.4 建立连接

在调用DDE之前首先需要确保它与其它的服务器没有联系,因此客户联接模式为vbLinkNone。然后再建立与MATLAB的联系MATLAB| Engine。当一项任务完成之后,需要将建立的联接断开。释放系统分配给应用程序的资源。

图1描述作为服务器的MATLAB与作为客户的VB之间通信的概念,它们之间的通信载体是其中的DDE模块,VB通过DDE函数将请求发出,MATLAB则通过DDE模块接受相应的对话要求。图2说明了MATLAB中的对话主题与具体的内容。

图1 MA TLAB服务器原理图图2 MA TLAB DDE结构图MATLAB中的具体数据类型如下:

EngEvalString:它表示采用文本内容进行DDE数据交换

EngStringResult:它表示将执行的结果回传到客户。

EngFigureResult:它表示将运行结果中的图形内容通过剪贴板回传客户。

mxtrix name:它表示将运算的结果通过矩阵方式传递给客户。

在具体的实现过程中,客户需要根据需要建立与MATLAB的联系,并分别指定不同的

传递内容。MATLAB将运算的结果分别以不同方式交给客户。

DDE使用剪贴板在应用程序间交换不同格式的数据,在MATLAB的引擎主题中通过使用文本格式数据的EngStringResult项,用户可以请求DDE执行命令的字符串结果;通过EngFigureResult项可以配合两种格式的数据使用,即文本格式与图元格式。当使用文本格式的数据时如果返回的字符串为“yes”,则表示当前图形元文件已经存放于剪贴板中,如果返回的是“no”表示剪贴板中没有相关内容。具体实现过程如下

MATLAB的Engine 主题对3 种客户端应用程序中可能的DDE 操作提供了支持,这些操作包括发送命令到MATLAB中执行以及从MATLAB中请求数据和向MATLAB发送数据。以文本框1(TextInput)传递数据,文本框2(TextOutput)接收数据为例说明如表1如示:

表1 MA TLAB接收指令说明

代码说明

Text Input . LinkMode = vbLinkNone 断开传递参数的控件与其它所有DDE有连接

Text Input . LinkTopic =“MA TLAB| Engine”连接对象(输入控件)到MA TLAB

Text Input . LinkItem =“EngEvalString”确定连接传递参数的格式是文本格式

Text Input . LinkMode = vbLinkManual 建立与MA TLAB的连接

szCommand = Text Input . Text

Text Input . LinkExecute szCommand 将VB的内容传递到MA TLAB可以执行的参数szCommand中,并执行该指令

Text Input . LinkMode = vbLinkNone 断开传递参数的控件与其它所有DDE有连接TextOutput . LinkMode = vbLinkNone 断开接收参数的控件与其它所有DDE有连接TextOutput . LinkTopic =“MA TLAB| Engine”连接对象(输出控件)到MA TLAB

TextOutput . LinkItem =“EngStringResult”确定接收参数的格式是文本格式

TextOutput . LinkMode = vbLinkManual 建立与MA TLAB的连接

TextOutput . LinkRequest 接收结果

TextOutput . LinkMode = vbLinkNone 断开传递参数的控件与其它所有DDE有连接

4 直方图功能

直方图用来描述图像的每个灰度值(0~255)的统计值图形,它表征某个灰度值出现的概率。它是图像处理中非常重要的基本处理技术之一。通过适当地调整直方图参数,可以将原本模糊不清甚至根本无法分辨的原始图片,处理成清楚、明晰、富含大量有用信息的可观图像,这类图像处理技术在医学、遥感、微生物、刑侦以及军事等诸多领域应用广泛。图像处理中应用比较多的是图像识别,通过对图像进行相关运算来实现。如增强对比度和动态压缩范围等等,这些处理方式都是针对原始图像的每一个像素,通过增强函数对像素的灰度级进行运算的。其处理过程主要是,并将运算结果作为该像素的新灰度值来实现的。通过改变选用的增强函数的解析表达式,改变原始图像各像素在各灰度级上的概率分布来实现的。因此直方图的内容可以直观体现处理的效果标志,通过直方图也可以分析采取的运算方式是否正确。

在图像处理和运算中,出于不同的要求,图像处理后的效果区别很大。MATLAB中有

许多固有的算法可以直接用于直方图的处理。下面是用MATLAB 实现直方图均衡化的源程

序及注解,输出结果如图3所示。 I=imread('flower.jpg');%读入图像文件

J=histeq(I,64);%对图像进行直方图均衡化,指定均衡化后的灰度级数为64

imshow(I),title(' 原始图像' );%显示原始图像

imhist(I),title(' 原始直方图' );%显示原始直方图

imshow(J),title(' 直方图均衡化后的图像' );%显示直方图均衡化后的图像

imhist(J),title(' 直方图均衡化后的直方图' );%显示直方图均衡化后的直方图

a

b

(a )原图及其对应的直方图 (b )均衡化后的图像及其对应的直方图 图3 MA TLAB 中直方图运算对图像处理的效果

通过比较可看出均衡化后的图像变得清晰,其直方图形状也比原直方图的形状更理想。但对于图像分析而言,更多的情况是选择不同函数对已有图像进行运算。如二值化处理、均衡处理、图像格式转换等。其主要目的是通过图像的转换实现特定的处理要求。图像处理是一项复杂的工作,没有固定的计算公式。因此,在研究过程中,需要通过选择不同函数、参数对图像进行分析与观察,根据计算结果确定运算的合理性与正确程度,进而得到相应的经验公式。

5 利用VB 与MATLAB 混合编程处理图像

MATLAB 的固定算法在参数的使用有具体要求。由于它是命令行操作方式,如果想修

改参数只能将代码重新修改运行。因此不能实现连续代码的控制。特别是关键参数的变化对于运行结果可能产生结果的确定。与之相对应,VB利用可以利用其灵活的控件操作实现连续数据的传递。在VB中通过确定滑块控件的Max、Min、LargeChange与SmallChange属性能够很方便控制连续参数的调整处理。结合DDE方式利用Picture控件显示运行的结果。从而观察实现图像处理中对于参数变化产生效果的分析。同时也可以利用文本框等交互方式,将需要的公式传递到MATLAB中,结合相关的参数调整,综合分析假设的算法对于指定图像处理是否正确。

需要注意的是MATLAB对于字母的大小写是有区别的,因此在程序代码的录入中需要特别注意。另外由于DDE 只是一种进程间的通信方式,它不负责进行进程的启动,所以执行这个程序前MATLAB必须已经处于开启状态,否则程序会报错。

结合DDE技术编写了相应的程序综合实现上述效果。利用VB作为客户端程序,MATLAB作为服务器程序进行图像的处理。程序运行界面如图4所示。

图4 程序界面说明

其中:

(1)、用于显示当前通过读取图像按钮指定的图像的路径及名称。

(2)、用于输入运算函数的公式

(3)、显示当前使用参数的Max、Min与当前值。

(4)、用于实现连续参数变化的滑块。

(5)、用于显示原图效果的图形控件

(6)、用于显示来自MATLAB运算的结果的一组控件。

利用一组文本框确定可变参数的变化范围,另一个文本框修改运算函数,利用VB中滑块控件实现可变参数的连续变化,将变化的参数通过剪贴板传递到后台运行的MATLAB中,运算结束后再通过剪贴板将生成的图像传递到相应的控件中显示出来。

在VB的良好界面环境中,可以将更多的注意力集中于函数的选择、修改,参数的范围确定等内容,不必每次都重新录入程序。程序运行后可以观察不同公式、参数对于同一图像

处理的差距。从而为图像的进一步处理提供参考依据。界面中输入公式的可变参数的传递,利用VB的转换函数与替换函数来实现。在公式文本框中的运算公式须符合MATLAB格式。使用滑块调整参数需要先输入变化范围,否则程序运行时出会报错。其中输入的最大值与最小值分别确定可变参数的取值范围,滑块调整的区间就在此范围之内。由于在混合编程中传递参数需要占据内存空间,因此滑块的动作只能选择change,而不能选择scroll。

通过滑块的调整,可以见到图像经过不同的控制参数的运算结果相差很大(如图5)其中图a表示可变化参数为Min时的运算结果,图b表示可变参数为Max时的运算结果。对比两图中原图与处理后图像的细节可以为选择参数提供依据。

(a)Min时的结果(b)Max时的结果

图5 运行结果对比

程序部分代码:

Private Sub Command4_Click() ‘图像处理部分

Text4.Text = "x=0:1:255;" + "y=" + Replace(Text1.Text, "c", Trim(Text6.Text)) + ";" + "plot(x,y);"

Text4.LinkMode = vbLinkNone

Text4.LinkTopic = "MATLAB|Engine"

Text4.LinkItem = "EngEvalString"

Text4.LinkMode = vbLinkManual

szCommand = Text4.Text

Text4.LinkExecute (szCommand)

Text4.LinkMode = vbLinkNone

Text5.LinkMode = vbLinkNone

Text5.LinkTopic = "MATLAB|Engine"

Text5.LinkItem = "EngFigureResult"

Text5.LinkMode = vbLinkManual

Text5.LinkRequest

Image1.Picture = Clipboard.GetData() '生成曲线图

Text4.Text = "I=imread('" + Trim(Text7.Text) + "');" + "J1=double(I);" _

+ "J2=" + Replace(Replace(Text1.Text, "c", Trim(Text6.Text)), "x", "J1") + ";" _

+ "J=uint8(J2);" + "imhist(J);"

Text4.LinkMode = vbLinkNone

Text4.LinkTopic = "MATLAB|Engine"

Text4.LinkItem = "EngEvalString"

Text4.LinkMode = vbLinkManual

szCommand = Text4.Text

Text4.LinkExecute (szCommand)

Text4.LinkMode = vbLinkNone

Text5.LinkMode = vbLinkNone

Text5.LinkTopic = "MATLAB|Engine"

Text5.LinkItem = "EngFigureResult"

Text5.LinkMode = vbLinkManual

Text5.LinkRequest

Image2.Picture = Clipboard.GetData() '生成直方图

Text4.Text = "I=imread('" + Trim(Text7.Text) + "');" + "J1=double(I);" _

+ "J2=" + Replace(Replace(Text1.Text, "c", Trim(Text6.Text)), "x", "J1") + ";" _ + "J=uint8(J2);" + "imshow(J);"

Text4.LinkMode = vbLinkNone

Text4.LinkTopic = "MATLAB|Engine"

Text4.LinkItem = "EngEvalString"

Text4.LinkMode = vbLinkManual

szCommand = Text4.Text

Text4.LinkExecute szCommand

Text4.LinkMode = vbLinkNone

Text5.LinkMode = vbLinkNone

Text5.LinkTopic = "MATLAB|Engine"

Text5.LinkItem = "EngFigureResult"

Text5.LinkMode = vbLinkManual

Text5.LinkRequest

Image3.Picture = Clipboard.GetData() '生成新图像

Label3.Caption = "运算之后的图像"

End Sub

分别使用下面表2的函数进行运算处理,通过程序中的显示结果可以分析不同函数的调整效果及不同参数的效果,从而为研究提供参考资料。

表2 运算函数MA TLAB 格式(Dmax 表示灰度度最大值取255)

数学公式 MA TLAB 公式 c 范围

)()(max x D Cx x x f ??= x+c.*x.*(255-x) -0.007~0.007

???????????????????+=21(sin 2sin 112)(max max D x D x f αππα (1+sin(c.*pi.*(x/255-0.5))/(sin(c.*pi/2.0))).*255/2.0

0.4~ 0.8 6 结束语

利用VB 与MA TLAB 混合编程可以充分发挥两种语言的特点,在图像处理中可以模拟仿真,大大提高了工作效率。可以充分利用MATLAB 强大的图像处理工具箱并根据运行效果对图像处理中所涉及函数功能及其所能产生的效果直观显示,从而为进一步研究提供重要信息。美中不足的是由于DDE 方式基于消息机制,不能脱离MATLAB 的环境,需要在执行DDE 之前首先启动MA TLAB 。

参考文献

[1] 涂望明 魏友国 施少敏. MATLAB 在数字图像处理中的应用[J].《微计算机信息》2007.23(2-3)(299~300)

[2] 孙兆林.MA TLAB6.x 图像处理[M].北京:清华大学出版社.2002(213~215)

[3] 谭炎 张凌燕. MA TLAB 与VB 混合编程技术研究.[J]《微计算机信息》2006.15(247~249)

[4] 冯安 王希常.MA TLAB 在数字图像增强中的应用. [J].《信息技术》2007.5(65~73)

[5] 刘志俭等.MA TLAB 应用程序接口用户指南[M].北京:科学出版社.2000(351~356)

Image processing by mixed programming between VB and

MATLAB

REN Shaobin 1, LI Yuanzhong 2

1 Computer Foundation Education Dept, Taiyuan University of Technology, Taiyuan (030024)

2 Robots Lab of Taiyuan University of Technology, Taiyuan (030024)

Abstract

The paper describes the method of how to combine the programming tools of MATLAB and VB to develop software for the characteristic analysis of images processing. The design efficiency is improved based on combined application of MATLAB and VB. The interface and image capturing function of the program are implemented by VB, all image processing functions are implemented by MATLAB engine. An example shows the programming process.

Key words: VB; MATLAB; DDE ;Mixed programming; Image processing

相关文档