图像信息处理是计算机信息处理的一个重要内容,同时,随着计算机及数字影像技术的日益成熟,使得数字图像处理技术在智能控制、模式识别等领域有广泛的应用前景。MATLAB是MathWorks公司研制、开发的一个强大的数学工具软件,它是一种以矩阵和阵列为基本编程单元的科学工程计算语言,因此,Matlab进行图像处理很有优势,不像其他大多数处理方式一样,要以像素为单位进行图像处理;同时,它把当前常用的图像处理程序以函数形式集成在其Image工具箱中,此工具箱中提供了大量的图像变换和处理函数,而且功能仍在不断丰富。然而,Matlab编制的程序执行速度比较慢,并且不能脱离Matlab环境,这就大大限制了程序的可移植性和通用性。
为了提高图像处理软件开发的效率和质量,可通过Matlab COM编译器,实现Maltab对图像进行处理和其它高级语言做界面开发的混合编程方法,这样充分利用了Matlab强大的图像处理能力和其它语言的开发界面方便的特点,有助于开发出高质量,高性能的图像处理软件。
1 Matlab应用程序接口—COM Builder
1.1 Matlab COM Builder简介
Matlab COM Builder是在Matlab6.5,也就是R13版本中才开始提供的一个新工具,它是Matlab Compiler的一个扩展功能,也是MathWorks公司推荐使用的混合编程方法。它提供了简单、易用的图形化界面,帮助用户将Matlab的M函数文件自动、快速地转变为独立的进程内COM组件,它以DLL(ActiveX DLL)形式被装入到客户的进程空间中,可以在任何支持COM组件的应用程序中使用。其工作原理是利用Matlab编译器把Matlab程序转换成C/C++程序,同时产生和COM有关的包装代码,然后调用外部编译器来产生COM对象[1]。
应用组件技术实现Matlab与其它高级语言混合编程,具有许多独特的优点,主要表现为:
1)适应性广,可用于任何支持组件技术的高级语言中。
2)不需要进行代码转换,使得编程风格一致。
3)方便灵活,既可以与Matlab协同工作,也可以生成不依赖于Matlab环境的独立应用程序,可以获得更快的运行速度。
1.2 COM Builder的安装、配置
Matlab COM Builder是Matlab Compiler的扩展,创建COM组件之前应安装Matlab6.5中的Matlab Compiler和Matlab COM Builder等模块;另外,还需要对Matlab Compiler进行必要的配置,方法为:在Matlab命令窗口键入“mbuild –setup”,将出现选择编译器的提问,所列出的编译器包括计算机中已安装的各种C/C++编译器,用户可以根据需要自行选择其中一种并确认即可。至此,我们就可以利用Maltab COM Builder生成需要的组件了。
一般来说,使用Matlab COM Builder编译COM组件包括4个步骤:
1)创建一个新的工程,或者打开一个已经存在的工程。
2)给工程加入需要的M程序或者MEX文件。
3)编译工程。
4)打包和发布产生的COM组件。
本文接下来会通过实例详细讲解COM Builder的使用
2 COM Builder在图像处理中的具体应用
2.1 M文件的编写
本实例以Maltab图像处理工具箱中的imhist、imcontour和im2bw三个函数为例来详细说明程序的实现过程。同时,作者还测试过图像处理工具箱中其它函数,例如图像增强函数imadd、旋转函数imrotate、滤波函数imfilter、边缘检测函数edge、分离块操作colfilt等进行了测试,均得到了很好的效果。当然,COM Builder并不是支持所有图像处理工具箱中的函数[2],它和Matlab Compiler的版本有关,具体可以参照所使用编译器的说明。
首先编写三个M文件imhist_test.m,imcontour_test.m和im2bw_test.m对要测试的三个函数进行包装,他们分别实现滤波,画图形等值线和转化为二值图像[3]。
imhist_test.m代码如下:
function imhist_test(filename)
I=imread(filename);
figure,imhist(I);
imcontour_test.m代码如下
function imcontour_test(filename)
I=imread(filename);
figure,imcontour(I,3);
im2bw_test.m代码如下:
function im2bw_test(filename)
I=imread(filename);
J=im2bw(I,0.4);
figure,imshow(J);
2.2 利用Matlab COM Builder生成COM组件
在Matlab命令窗口键入comtool或单击Matlab操作桌面左下角Start/Matlab/Matlab Com Builder/ Matlab/ Matlab Com Builder选项,调出创建COM组件所需要的可视化编辑环境Matlab Com Builder主窗口;在“File”菜单下选择“New Project”,打开“New Project Settings”对话框;在“Component name”框中输入组件名称imagepro,会在“Class name”框中生成默认的类名,也可以通过“Add”和“Remove”修改类名,在修改时不要与M文件名相同,本实例中我们使用默认的类名;在“Project version”框中取默认的版本号1.0;在“Project directory”框中指定在编译和打包时,工程和相关文件的存放位置;在“Compile code in”选择生成C或C++代码,一般选择C;如果要包含Matlab句柄图形调用,则须选择“Use Handle Graphics Library”复选框,在工程中包含Matlab的C/C++图形库;设置完成后点击“OK”按钮。
工程创建之后,生成器主窗口的“Project”、“Build”、“Component”等3个菜单就变成为可用。点击“Add File”按钮向工程中添加M文件,由于每次只能添加一个,所以需要多次操作将所有的M文件添加到工程里面,分别将建立的imhist_test.m、imcontour_test.m和im2bw_test.m添加到工程中。右键选择添加的M文件,“Remove”命令可以删除添加的文件,“Edit”命令可以修改添加的M文件。M文件添加完毕后,点击“Build”菜单下的“COM Object”选项来调用Matlab编译器进行编译,生成对象文件及输出文件DLL,并将DLL自动注册到系统中。在编译的过程中,当出现“Standalone DLL build complete”表明已编译注册成功[4]。
Matlab COM Builder制作COM的组件可以包含多个类,在每个类中可以加入多个M文件,一个M文件实际就是一个函数,用function开头,并可以带多个输入、输出参数。上面imhist_test.m、imcontour_test.m和im2bw_test.m就是imageproClass类中的三个方法。
2.3 使用生成的DLL文件
利用Maltab COM Builder生成的DLL具有一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。例如VB、VC、Delphi等,本文以VC#.NET为例,讲解对生成DLL文件的调用。
打开VS.NET新建Visual C#项目ImageProcessing,选择Windows应用程序。菜单“项目”—“添加引用”,打开“添加引用”对话框,选择“COM”页,找到“imagepro_1_0.dll”,将其添加到工程里面。
在VC#.NET中使用DLL文件时使用的参数必须是object类型的变量。可以通过OLE/COM Object Viewer来查看函数接口参数个数等信息。本实例中查看imcontour_test的结果为:void imcontour_test([in] VARIANT filename);表示只有一个输入参数filename。如果接口既有输出又有输入,则输出参数必须要为引用类型;另外,第一个参数表示输出参数的个数,如果没有输出参数,第一个参数可以省略,本实例中没有输出参数,故可以省略,因此,只有一个参数filename。
实现代码如下:
//引用命名空间,也就是我们创建组件的时候输入组件的名字imagepro
using imagepro;
// 声明输入参数filename
object filename=null;
//通过打开对话框,将图片文件名称保存在filename中
//同时将原始图片显示在picturebox1中(如图1)
openFileDialog1.Filter="BMP Files(*.bmp)|*.bmp";
openFileDialog1.ShowDialog();
filename=openFileDialog1.FileName;
pictureBox1.Image=System.Drawing.Image.FromFile(openFileDialog1.FileName);
// mImhist_Click:测试imhist函数(如图2)
imagepro.imageproClass test=new imagepro.imageproClass();
test.imhist_test(filename);
// mImcontour_Click:测试imcontour函数(如图3)
imagepro.imageproClass test=new imagepro.imageproClass();
test.imcontour_test(filename);
// mIm2bw_Click:测试im2bw函数(如图4)
imagepro.imageproClass test=new imagepro.imageproClass();
test.im2bw_test(filename);
3 程序的发布
由于VC#.NET编写的程序调用了Maltab COM,要使该程序脱离Matlab环境运行,首先需要注册使用的COM,Matlab COM Builder也周到地想到了这一点,提供了COM打包程序,在Matlab COM Builder窗口中使用菜单选项Component—〉Package Component(如图5)。
这样会在distrib文件夹下生成一个自解压的安装文件,本例中生成了imagepro.exe。将该文件拷贝到没有Matlab的机器上运行,实现必要动态链接库的安装和COM组件的注册,用户根据提示操作即可,主要的操作有两个:一个是输入解压目录,另一个就是设置系统的搜索路径。另外一个需要注意的问题就是输入的文件夹目录中不能包含中文。安装完成后,在imagepro.exe所在的文件夹下生成了如表1所示的文件夹和文件。最后将生成的"bin"win32文件夹整个目录加入系统环境变量的PATH中,完成系统搜索路径的设置。至此,此程序就可以脱离Matlab环境运行了。
表1 运行imagepro.exe生成的文件和文件夹
文件或文件夹 |
文件说明 |
"bin"win32 |
内有MATLAB的运行时库 |
"toolbox"matlab |
内有MATLAB的运行时库 |
Mwregsvr.exe |
注册DLL的可执行文件 |
Imagepro_1_0.dll |
编译好的组件 |
4 结论
本文将Matlab图像处理工具箱中的函数进行包装,通过COMBuilder将Maltab强大的图像处理功能与其它高级语言高效的图形界面开发有效结合起来,大大提高了图像处理软件的开发效率,并且这种方法开发的程序可以脱离Matlab环境运行。同时,通过这种方法可以将Matlab中常用的图像处理函数分类包装到一个COM中,Matlab中的每一个函数对应于COM中一个方法,形成一个强大、易用的图像处理组件。
参考文献:
[1] 董维国.深入浅出Matlab7.X混合编程[M].北京:机械工业出版社,2005
[2] Matlab COM builder user’s guide[Z].The Mathworks Inc,2002
[3] 李文煜.VC++与Matlab混合编程实现图像处理[J].计算机仿真.2005,22(1):254-257
[4] 岳玉芳等.基于COM的VB与Matlab混合编程[J].计算机工程与设计.2005,26(1):61-65