C#与MATLAB混编方法在图像处理中的应用研究
2018-07-10陈晓勇
卢 兴, 陈晓勇
(1.东华理工大学测绘工程学院,江西 南昌 330013;2.流域生态与地理环境监测国家测绘地理信息局重点实验室,江西 南昌 330013)
1984年,美国 MathWorks 公司首次推出MATLAB软件,MATLAB拥有国际公认的最优秀的数值计算和仿真分析能力,其科学计算与可视化功能强大,它提供了一个功能完善的程序设计和数据处理集成环境(李雯,2016)。MATLAB是一个高度集成的模块化系统,集科学计算 、图象处理等于一体,使用解释性语言,具有极高的编程效率(Shen et al.,2005)。MATLAB虽然有众多优点,但缺点也不少:其提供的M语言需要逐行解释执行,效率较低,界面开发能力差,十分依赖MATLAB运行环境(朱艳平,2016)。
C#(C sharp)是微软于2000年推出的一种以面向对象为编程理念的高级编程语言。C#与C/C++语言相比,C#编程更加简易、安全,而且是以面向对象为编程思想的独特编程语言。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#( Roberto et al.,2003)。
C#拥有优良的用户应用界面设计与开发能力,具备许多种类的界面高级设置。而MATLAB则拥有优秀的数值计算能力。MATLAB中的函数储存在.m脚本文件中,并对用户完全开放,用户可以随时修改文件中的内容。利用MATLAB中提供的函数和算法实现某些功能的编写,而主体软件和界面用C#.NET进行开发(王文斌等,2015)。充分结合两者的优点,可以更加高效地设计出优秀的应用软件,用途广泛,前景广阔。
1 C#与MATLAB混合编程
1.1 混合编程的基本思想
混合编程即在一个软件的开发过程中,将不同方面,不同阶段的编程、算法或数据处理分别由相应方面能力更强的软件去执行,最后完成优势互补,开发成效率更高的软件。
在混合编程研究方面,许多专业人员取得了良好的研究成果。张燕等(2008)利用M函数文件编译成C共享库的方法实现了C#与MATLAB混编;Bistak(2013)利用C#与MATLAB/Simulink混合编程开发远程控制实验室系统,并介绍了该系统在磁悬浮与液压系统中的应用;许茂增等(2015)运用C#与MATLAB混合编程设计并实现了物流需求预测系统,并在实例中表现出该系统良好的适用性与高预测精度。
1.2 C#与MATLAB混合编程的方法
(1)C#直接调用MATLAB程序文件。MATLAB以自身为引擎,提供了一系列可供其他程序调用的函数,其他编程软件可以通过这些函数来调用MATLAB程序。该引擎提供的3个常用接口为:Execute、PutFullMatrix、GetFullMatrix。其功能分别是:执行脚本命令、从MATLAB Server中添加矩阵和读取矩阵(曹洪涛等,2015)。
(2)C#调用MATLAB编译器生成的C语言共享库。MATLAB编译器模块能够生成多种共享库,其中便包括C语言共享库。C语言共享库是可与外界程序链接的函数接口库。
(3)使用MATLAB DeployTool生成.Net组件或.com组件。COM(组件对象模型,Componet Object Model)是以组件为发布单元的对象模型,该模型有利于各个软件组件之间采用统一的格式相互通讯,使得不同语言程序之间可以相互调用(朱峰等,2011)。由MATLAB编译器生成的.Net独立组件是动态链接库dll文件,可以脱离MATLAB环境与其他任何支持集成开发的程序相结合,并在没有安装MATLAB的计算机中运行。
在以上三种方法中,第一种方法操作简单、易行,但是执行效率太低,无法脱离MATLAB独立运行。利用MATLAB生成C语言共享库的方法使速度明显提升,但程序不稳定,易出错。利用.com或.Net组件的方法生成的动态链接库dll文件可脱离MATLAB环境,较好的与其他程序结合,且生成和编译过程较简单,效率颇高。综上所述,实际应用过程中采用C#调用.Net组件或.com组件的方法最为合适。
2 图像处理
2.1 图像处理技术
20世纪中期,人们对数字图像处理的研究步入正轨。数字图像处理(Digital Image Processing)是利用计算机的强大能力处理数字图像,从而增强数字图像的识别度、信息量或专题化等等的方法和技术。图像处理的目的是恢复图像的本来面目,改善人的视觉效果,突出图像中目标物的某些特征,提取目标物的特征参数(李俊山等,2006)。常见的处理有图像数字化、图像增强、图像复原、图像分割、图像分析等(陈汗青等,2013)。
图像可能由于各类原因导致图像数据破坏,通常利用图像增强来改善图像数据质量。图像增强是利用各种数学方法和变换手段来提高图像的对比度和清晰度(刘治群等,2010)。滤波是图像增强的常用方法,图像滤波可以去除图像中的噪声或突出特征以恢复或提升图像质量。
图像分割:即把图像划分为几个特定部分,从中提取出对人类有用的对象。图像分割是计算机视觉和图像处理领域具有挑战的重要问题,它在图像检索、目标识别和图像分析等更高级的任务中充当着基本的,也是关键的一步(何斌等,2001)。分割方法大致分为三种:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法(殷国军等,2009)。
2.2 MATLAB中的数字图像处理
MATLAB提供的图像处理工具箱(Image Processing Toolbox),是利用MATLAB强大的数学计算能力,提供可参照的标准算法和图形工具给用户,并实现广泛的图像处理操作(杨保华等,2016)。MATLAB中的部分图像处理函数如下:
rgb2gray():该函数能实现图像的灰度化,向该函数输入图像矩阵即可得相应图像的灰度图。
imhist():该函数可计算输入图像的灰度值信息,并显示相应直方图。
histeq():该函数可实现直方图的均衡化处理。
imnoise():该函数可向图像中加入噪声,输入值可自定义噪声类型与参数。
imfilter():该函数能对多位图像进行滤波处理,输入值中可自定义模版与参数。
medfilt2():该函数用于图像的中值滤波处理。输入值中可自定义模版与参数。
fspecial():该函数可创建自定义的滤波算子。输入值中可自定义算子类型与参数。
edge():该函数用于边缘检测。输入值中包括6种算法类型:Sobel,Prewitt,Roberts,Laplacian,均值(zero-cross),Canny。
3 C#与MATLAB混合编程在图像处理中的应用
3.1 混合编程程序功能结构
在混合编程前,设计程序的界面与框架。程序中包含多种经典图像处理功能以及必要的基础功能。程序的框架如图1所示。
图1 混合编程程序框架Fig.1 Mixed programming framework
3.2 C#与MATLAB混合编程过程与关键技术
(1)MATLAB函数编译工作。C#与MATLAB混合编程需要用到MATLAB中的图像处理函数,因此在混编之前,需要运用MATLAB提供的编译工具(DeployTool)将这类函数编译成.NET组件。
研究中所使用的MATLAB版本号为R2015b。编译过程为:打开MATLAB,在主窗体Command Window中输入Deploy指令,打开Deployment Project窗口,输入自定义的文件名称,存储位置以及编译类型,编译类型选择.Net Assembly。
在生成的.Net组件内容构筑中,加入自定义的类名并向类中添加要编译的 MATLAB函数.m文件。最后选择Build完成.Net组件的生成。
(2)C#调用.Net组件。在混合编程项目的引用中添加.Net组件,MWArray.dll和CsharpMATLABMix.dll文件,并添加到相应的命名空间,主要代码如下:
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using CsharpMATLABMix;
(3)C#与MATLAB数据传递。因为C#与MATLAB之间的语言思路与计算方式不同,数据间无法直接传递。因此,.Net组件中运用MWArray类型作为中间类型,使得C#中数据的类型与MATLAB中数据的类型皆可转换至MWArray类型,从而达到相互转换的目的。.Net数据类型、MATLAB类型与MWArray类三者间的转换表如下(表1)。
(4)C#图像处理。C#编程过程中,需要用到C#的图像处理方法。C#中常用的三种图像处理方法分别是:像素法、内存法与指针法。其中像素法最简单,核心思想是利用Bitmap类中的GetPixel与SetPixel方法获取与设置图像中一个指定的像素的颜色。使用像素法需要对每一个像素进行提取和重新设置颜色,方法简单,操作方便,但效率太慢,导致性能大大降低,运行时间太长,在实际项目中是不可取的。
表1 MATLAB类型、.Net类型与MWArray类转换表
内存法的核心思想是利用锁定位图的方式将图像锁定并复制于内存中,然后对内存中的图像数据直接进行处理。内存法的图像处理效率比像素法明显有极大的提高,代码难度较为一般,不难编写。内存法的关键代码如下:
Bitmap bitImage = new Bitmap(image);
Rectangle rt = new Rectangle(0, 0, bitImage.Width, bitImage.Height);
//锁定位图并设置相关属性
BitmapData bmpData = bitImage.LockBits (rt,ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
指针法直接运用指针的特殊性能来进行图像的处理,运行速度比内存法更快,但其不足是编码较难,不易掌握,而且使用不安全代码需要承担风险,一旦代码有误,可能引发安全性问题,造成更多损失。
通过以上分析,本文程序中主要运用内存法编写图像处理代码,内存法处理效率远远高于像素法,处理速度上稍慢于指针法,但代码安全度高,不易出现安全性错误,是相对合理的一种方法。
(5)C#与MATLAB混编函数应用。使用内存法加载图像数据后,将其加入编译函数中处理,最后输出处理完成的图像数据。且在C#编写中,函数的使用与MATLAB中对应函数的使用是几乎一致的。以函数filter2()为例:
函数filter2()的调用格式如下:
Y=filter2(B,X),参数说明:filter2()使用矩阵B中的二维FIR滤波器对数据X进行滤波,如果Y是通过二维互相关计算出来的,其大小与X一样。
在C#中实际应用代码如下:
ImageSmoothingSharpening iss = new ImageSmoothingSharpening();
MWArray smoothingDate = iss.filter2(iss.fspecial("average", 3), mwDate);
其中,mwDate为待处理的图像数据。函数fspecial()的作用是依据输入参数输出相应模版,用于图像的滤波处理。函数fspecial()的调用格式如下:
h=fspecial(type)
h=fspecial(type,para)
参数说明:type:指定算子的类型;para指定相应的参数;h:返回的模版。
3.3 C#与MATLAB混合编程实现与分析
运用C#与MATLAB混合编程实现的图像处理程序中实现了多项功能,其中除了基本功能外,所有图像处理功能都是基于C#与MATLAB混合编写的。在函数的使用方面,C#与MATLAB的混合编程具有较高的兼容性,这使得编程人员可以更方便地使用混合编程中的函数。而基于C#与MATLAB混合编程的图像处理效果也较为理想。在程序编写过程中,使用东华理工大学南昌校区高分影像作为程序的实验图像(图2)。处理成果见图3至图5。
图2 程序界面与原图Fig.2 program interface master map
图3 均值滤波处理后的图像Fig.3 Image processed by mean filter
图4 Sobel算子边缘检测图Fig.4 Edge detection graph of Sobel operator
图5 迭代分割效果图Fig.5 Iterative segmentation effect diagram
3.4 C#编程、MATLAB编程与混编三种编程方法对比
本文针对580*800的8位图像,分别使用C#语言、MATLAB语言与混合编程方法,在CPU为i3-2310,内存为4G的PC机进行线性滤波和迭代分割,其结果如表2、表3所示。
表2 三种编程方法实现图像线性滤波
表3 三种编程方法实现图像迭代分割
从以上两个实验中可以看出,MATLAB拥有良好的科学计算能力,能够用较简短的代码实现图像处理方法,缺点是运行较长;C#语言编写的方法运行时间较快,且越好的代码运行速度越快,但代码长度也越长,需要更久的编写时间;C#与MATLAB混编编写的所有方法中,其代码基本都保持在较短的长度,比前两者方法更加简化。在运行速度方面, MATLAB运行时间最长,C#编写方法速度通常最快,C#与MATLAB混编方法能够保持较快速度,并且个别代码运行速度快于C#编写方法。
由此分析可以得出,C#与MATLAB混编方法在代码长度上比MATLAB编写方法和C#编写方法都更加简化,能用较短代码实现图像处理方法。混编方法在运行时间上保持着较快速度,远快于MATLAB编写方法。
4 结论
本文用C#与MATLAB混合编程的方法处理图像,达到了令人满意的结果。从上节分析中可以看出,混编方法极大的缩短了代码长度,减少了编程工作量,提高了软件开发的效率。混合编程方法充分利用了MATLAB强大的计算能力与高效的图像处理能力,高度结合C#优秀的用户界面开发能力与C#语言优势,弥补了MATLAB界面开发能力不足与C#代码冗长的缺点。以C#与MATLAB混合编程为基础,可以进一步扩展其他软件的结合开发,如MATLAB与ArcEngine结合等。混编方法为图像处理提供了一种提高效率的思路,也为软件开发提供了更多的可能。