基于MATLAB与C/C++混合编程的数字图像处理实验教学研究
2017-07-18魏毅林丽惠
魏毅,林丽惠
(武夷学院数学与计算机学院,福建武夷山354300)
基于MATLAB与C/C++混合编程的数字图像处理实验教学研究
魏毅,林丽惠
(武夷学院数学与计算机学院,福建武夷山354300)
针对数字图像处理实验教学难度大的问题,提出一种基于MATLAB与C/C++语言混合编程的数字图像处理实验教学方法。该方法用MATLAB编写图形用户界面、主流图像格式的读写函数、统计图表的生成函数,用C/C++语言编写数字图像处理的核心算法,并用MATLAB的编译器将C/C++程序转换为MATLAB环境中的可执行程序。这种以MATLAB为主框架、C/C++为子框架的架构能充分发挥MATLAB和C/C++语言在数字图像处理实验中的优势,增强数字图像处理实验的可实践性,降低非核心实验内容的实践难度,有效提高学生在数字图像处理方面的技能。
数字图像处理;MATLAB与C/C++混合编程技术;实验教学
数字图像处理是计算机工程、电子工程、自动化等学科的一门重要专业课程。数字图像处理涉及大量的复杂数学推导,对于应用型本科院校的学生而言,很难通过对数学推导的学习来直观地理解数字图像处理算法的核心思想。因此,学生动手编写数字图像处理算法的代码对于提升他们对算法的理解就尤为必要。
目前有两种数字图像处理实验教学模式。1)基于MATLAB数字图像处理工具箱的模式。MATLAB是美国MathWorks公司出品的商业数学软件,主要用于数值计算、数据分析与可视化、算法原型开发等。它具有简洁的脚本语言、良好的图形化界面、强大的统计图表制作与显示功能,初学者易于上手学习。MTALAB数字图像处理工具箱实现了常见的数字图像处理算法,已在很多教学实验中得到应用[1-4]。该模式优点在于学生能使用工具箱的API(application programming interface)快速看到图像处理算法的实现效果,但缺点在于MATLAB采用解释型的脚本语言,其程序的执行速度相较于编译型语言,如C语言,要较慢很多,此外,它的可移植性也不佳,因此不适合在实际的工程项目中应用。2)基于C/C++语言的模式。该模式使用C/C++语言编写图像处理算法[5-6],或使用第三方库,如OpenCV[7]。该模式的优点在于能通过编写数字图像处理算法的底层代码来了解算法的思想,并且基于C/C++语言编写的代码具有很高的执行效率和较好的跨平台性,适用于实际工程项目的开发。该模式的缺点在于需要编写大量的代码来处理多种主流图片格式的输入/输出,掌握MFC(microsoft foundation class)或者QT等用户界面的开发工具来生成用户友好的界面以及各类统计图表的展示。这些非数字图像处理核心的代码编写任务是繁重的,对于非计算机专业的学生而言更是如此。
基于MATLAB与C/C++混合编程的数字图像处理实验教学是解决上述问题的一种有效方法。该方法用MATLAB编写图像用户界面、主流图像格式的读写、统计分析图表的生成,用C/C++言语编写图像处理的核心算法,充分发挥MATLAB和C/C++语言在数字图像处理实验中的优势。这种以MATLAB为主框架、C/C++为子框架的程序架构提升了实验的可动手性,降低了实验中非核心内容的实践难度。事实上,基于MATLAB与C/C++混合编程的模式是解决工程与研究问题的一种有效方法,已在机械动态仿真[8]、电力系统负荷计算[9]、图像处理[10]等方面得到广泛应用。学生通过实践基于MATLAB与C/C++混合编程的数字图像处理实验,将使其掌握这种在工程项目开发中的先进技术。
1 MATLAB与C/C++混合编程方法
MATLAB与C/C++混合编程分为两类:MATLAB调用C/C++和C/C++调用MATLAB。主要关注MATLAB调用C/C++的方法,C/C++调用MATLAB的方法本文不涉及,相关内容可参阅文献[11]。在MATLAB环境下调用C/C++程序需要借助MATLAB编译器将C/C++程序编译为MEX(MATLAB Executable)文件,然后在MATLAB命令提示符下键入MEX文件的文件名就完成了对C/C++程序的间接调用。图1以example.c的C/C++程序为例,说明整个流程。
图1 MATLAB环境下调用C/C++程序的流程Figure 1 The flow of calling a C/C++program in MATLAB
C/C++程序需要包括两个指定的部分:头文件信息,#include“mex.h”;入口函数:mexFunction。mex-Function函数的作用与C/C++中main函数的功能类似,它是MATLAB与C/C++语言之间的接口。例如,在文件example.c中写入图2中的C/C++代码,然后在MATLAB中执行命令mex example.c,则在与文件example.c相同的目录下就生成了example.mexw64文件,这是编译成功的MEX文件。
图2 example.c文件Figure 2 The file of example.c
mexFunction函数中的参数含义有如下4点。1)int nlhs:输出参数的个数;2)mxArray*plhs[]:输出参数的mxArray数组;3)int nrhs:输入参数的个数;4)mxArray*prhs[]:输入参数的mxArray数组。假设在MATLAB环境中调用example函数:[Out1,Out2]=example(In1,In2,In3)。则example函数输入参数的对应关系是:prhs[0]←In1,prhs[1]←In2,prhs[2]←In3;example函数输出参数的对应关系是:plhs[0]→Out1,plhs[1]→Out2;nlhs是2,nrhs是3。用C/C++编写代码的关键之处在于mexFunction函数中MATLAB与C/C++之间的数据交换。MATLAB规定所有数据类型均可用mxArray描述,并且mexFunction函数的所有输入输出参数均采用mxArray来定义。MATLAB提供多个以mex为前缀的API将mxArray类型的数据转化为C/C++可直接使用的基本数据类型,如int、char、double等[11]。MATLAB调用C/C++的规范简单易懂,学生动手实验几个实例之后就可掌握。
2 数字图像处理实验的内容设置
目前开设数字图像处理课程的理工科专业越来越多,涵盖了计算机工程、电子工程、自动化、数字媒体等。根据人才培养方案的目标,不同专业安排的实验教学课时通常在10~24课时之间。为兼顾基本知识面与扩展知识点,将实验内容分成8个实验单元,每个实验单元的课时为2~4个。8个实验单元中的6个单元构成实验的基本模块,2个单元构成实验的进阶模块,教师可根据学生专业需求安排具体的实验单元(图3)。
图3 数字图像处理实验的内容Figure 3 The content of digital image processing experiments
8个单元涵盖的实验内容如下:
1)图像点运算模块,线性变换、阈值变换、窗口变换和灰度拉伸等;
2)图像几何变换模块,图像平移、图像缩放、图像镜像变换和图像旋转等;
3)图像频域变换模块,傅里叶变换、离散余弦变换、沃尔什变换、哈达玛变换和小波变换等;
4)图像编码模块,哈夫曼编码、香农编码、行程编码、算术编码和JPEG编码等;
5)图像恢复模块,逆滤波、Wiener滤波、约束最小二乘滤波和盲解卷积等;
6)图像增强模块,空间滤波、图像平滑、图像锐化、频域滤波和伪彩色增强等;
7)图像分割模块,基于阈值的分割、基于边缘的分割和基于区域的分割等;
8)图像特征提取模块,图像几何特征描述、图像形状特征描述和图像区域特征描述等。
考虑到不同专业的实践要求,实验可按图4所示的双轨制方法进行。例如,对于计算机工程专业的学生,采用MATLAB与C/C++混合编程的方法进行实验,并将实验结果与直接调用MATLAB数字图像处理工具箱中API的运行结果进行对比,以加深对算法原理的理解。对于数字媒体专业的学生,只需调用MATLAB数字图像处理工具箱中的API进行实验,以使他们对算法原理和处理结果有直观理解,而不过多强调编程技巧。
图4 数字图像处理实验的双轨制方法Figure 4 The double-track method for digital image processing experiment
3 实验案例
以数字图像处理中的线性变换算法为例,按照MATLAB规范,用C/C++编写数字图像的线性变换程序(图5),然后将该程序与MATLAB数字图像处理工具箱的API函数imadjust进行对比,观察它们对同一组输入参数的输出结果。实验步骤如下:
1)创建名为testMEX.c的文件,然后在其中写入下述步骤2、3的代码;
2)用C/C++编写数字图像处理函数imadjustbyC,其函数形式参考API函数imadjust(I,[low_in;hign_in],[low_out;high_out]),写为void imadjustbyC(double*img,int len,double low_in,double hig_in,double low_out,double hig_out)。参数double*img指向存放图像数据的首地址,int len是图像数据包含的像素个数,double low_in、double hig_in、double low_out、double hig_out与imadjust中的含义一致;
3)按照MATLAB规范,编写固定头格式的函数void mexFunction(int nlhs,mxArray*plhs[],int nrhs,constmxArray*prhs[])。该函数把输入的数据转化为C/C++可识别的格式,然后再调用imadjustbyC函数对转换格式后的输入数据进行处理,最后将处理结果按MATLAB规范返回。这其中用到的函数mxGetM、mxGetN、mxGetPr、mxCreateDoubleMatrix均是MATLAB提供的API,细节可参阅MATLAB的外部程序接口手册[12];
4)在MATLAB中输入命令mex testMEX.c,编译成功后,生成了可在MATLAB环境中直接调用的模块testMEX.mexw64;
5)调用testMEX.mexw64和imadjust对数字图像处理实验中的一幅标准图片(图6a)进行处理,对比实验结果。调用语句如下:
>>A=imread('cameraman.tif');
>>B=uint8(testMEX(double(A),0.5,0.9,0,1));
>>D=imadjust(A,[0.5 0.9],[0 1]);
图6b和图6c给出了两种方法的处理结果。为比较这两个结果是否一致,首先将矩阵B和D相减,然后输出其中绝对值最大的元素。命令语句如下:
电力系统负荷计算研究[J].大连海事大学学报,2013,39(1):103-106.
[10]范芳蕾,李亮玉,周鑫,等.基于VC++与Matlab混合编程的焊接熔池图像处理[J].天津工业大学学报,2007,26(4):51-53.
[11]刘维.精通Matlab与C/C++混合程序设计[M]四版.北京:北京航天航空大学出版社,2015.
[12]The MathWorks,Inc.MATLAB External Interfaces Reference(R2017a)[EB/OL].(2017-03-01)[2017-03-30].https://www.mathworks.com/help/pdf_doc/matlab/apiext.pdf.
(责任编辑:叶丽娜)
Research on Experimental Teaching of Digital Image Processing Based on M ixed Programm ing Technology of MATLAB and C/C++
WEIYi,LIN Lihui
(School ofMathematics and Computer,WuyiUniversity,Wuyishan,Fujian 354300)
An experimental teachingmethod based onmixed programming technology of MATLAB and C/C++is proposed to solve the difficulty of practice teaching on digital image processing.In thismethod,the graphical user interface,the input/output functions formainstream images’formats and the functions for creating statistical charts are coded by MATLAB.The key algorithms are coded by C/C++and these C/C++programs are compiled into executable files by MATLAB Compiler.This framework in which MATLAB ismaster and C/C++is slave canmake better use of themeritofMATLAB and C/C++in practice of digital image processing,enhance the practicalness of experiments,reduce the difficulty of practice of non-key parts in experiments and improve students’skill of digital image processing effectively.
digital image processing;mixed programming technology ofMATLAB and C/C++;experimental teaching
G642.0
:A
:1674-2109(2017)06-0092-05
2017-03-31
武夷学院引进人才科研启动项目(YJ201607)。
魏毅(1978-),男,汉族,讲师,主要从事虚拟现实的研究。