魏毅,林麗惠
(武夷學(xué)院數(shù)學(xué)與計(jì)算機(jī)學(xué)院,福建武夷山354300)
基于MATLAB與C/C++混合編程的數(shù)字圖像處理實(shí)驗(yàn)教學(xué)研究
魏毅,林麗惠
(武夷學(xué)院數(shù)學(xué)與計(jì)算機(jī)學(xué)院,福建武夷山354300)
針對(duì)數(shù)字圖像處理實(shí)驗(yàn)教學(xué)難度大的問(wèn)題,提出一種基于MATLAB與C/C++語(yǔ)言混合編程的數(shù)字圖像處理實(shí)驗(yàn)教學(xué)方法。該方法用MATLAB編寫圖形用戶界面、主流圖像格式的讀寫函數(shù)、統(tǒng)計(jì)圖表的生成函數(shù),用C/C++語(yǔ)言編寫數(shù)字圖像處理的核心算法,并用MATLAB的編譯器將C/C++程序轉(zhuǎn)換為MATLAB環(huán)境中的可執(zhí)行程序。這種以MATLAB為主框架、C/C++為子框架的架構(gòu)能充分發(fā)揮MATLAB和C/C++語(yǔ)言在數(shù)字圖像處理實(shí)驗(yàn)中的優(yōu)勢(shì),增強(qiáng)數(shù)字圖像處理實(shí)驗(yàn)的可實(shí)踐性,降低非核心實(shí)驗(yàn)內(nèi)容的實(shí)踐難度,有效提高學(xué)生在數(shù)字圖像處理方面的技能。
數(shù)字圖像處理;MATLAB與C/C++混合編程技術(shù);實(shí)驗(yàn)教學(xué)
數(shù)字圖像處理是計(jì)算機(jī)工程、電子工程、自動(dòng)化等學(xué)科的一門重要專業(yè)課程。數(shù)字圖像處理涉及大量的復(fù)雜數(shù)學(xué)推導(dǎo),對(duì)于應(yīng)用型本科院校的學(xué)生而言,很難通過(guò)對(duì)數(shù)學(xué)推導(dǎo)的學(xué)習(xí)來(lái)直觀地理解數(shù)字圖像處理算法的核心思想。因此,學(xué)生動(dòng)手編寫數(shù)字圖像處理算法的代碼對(duì)于提升他們對(duì)算法的理解就尤為必要。
目前有兩種數(shù)字圖像處理實(shí)驗(yàn)教學(xué)模式。1)基于MATLAB數(shù)字圖像處理工具箱的模式。MATLAB是美國(guó)MathWorks公司出品的商業(yè)數(shù)學(xué)軟件,主要用于數(shù)值計(jì)算、數(shù)據(jù)分析與可視化、算法原型開(kāi)發(fā)等。它具有簡(jiǎn)潔的腳本語(yǔ)言、良好的圖形化界面、強(qiáng)大的統(tǒng)計(jì)圖表制作與顯示功能,初學(xué)者易于上手學(xué)習(xí)。MTALAB數(shù)字圖像處理工具箱實(shí)現(xiàn)了常見(jiàn)的數(shù)字圖像處理算法,已在很多教學(xué)實(shí)驗(yàn)中得到應(yīng)用[1-4]。該模式優(yōu)點(diǎn)在于學(xué)生能使用工具箱的API(application programming interface)快速看到圖像處理算法的實(shí)現(xiàn)效果,但缺點(diǎn)在于MATLAB采用解釋型的腳本語(yǔ)言,其程序的執(zhí)行速度相較于編譯型語(yǔ)言,如C語(yǔ)言,要較慢很多,此外,它的可移植性也不佳,因此不適合在實(shí)際的工程項(xiàng)目中應(yīng)用。2)基于C/C++語(yǔ)言的模式。該模式使用C/C++語(yǔ)言編寫圖像處理算法[5-6],或使用第三方庫(kù),如OpenCV[7]。該模式的優(yōu)點(diǎn)在于能通過(guò)編寫數(shù)字圖像處理算法的底層代碼來(lái)了解算法的思想,并且基于C/C++語(yǔ)言編寫的代碼具有很高的執(zhí)行效率和較好的跨平臺(tái)性,適用于實(shí)際工程項(xiàng)目的開(kāi)發(fā)。該模式的缺點(diǎn)在于需要編寫大量的代碼來(lái)處理多種主流圖片格式的輸入/輸出,掌握MFC(microsoft foundation class)或者QT等用戶界面的開(kāi)發(fā)工具來(lái)生成用戶友好的界面以及各類統(tǒng)計(jì)圖表的展示。這些非數(shù)字圖像處理核心的代碼編寫任務(wù)是繁重的,對(duì)于非計(jì)算機(jī)專業(yè)的學(xué)生而言更是如此。
基于MATLAB與C/C++混合編程的數(shù)字圖像處理實(shí)驗(yàn)教學(xué)是解決上述問(wèn)題的一種有效方法。該方法用MATLAB編寫圖像用戶界面、主流圖像格式的讀寫、統(tǒng)計(jì)分析圖表的生成,用C/C++言語(yǔ)編寫圖像處理的核心算法,充分發(fā)揮MATLAB和C/C++語(yǔ)言在數(shù)字圖像處理實(shí)驗(yàn)中的優(yōu)勢(shì)。這種以MATLAB為主框架、C/C++為子框架的程序架構(gòu)提升了實(shí)驗(yàn)的可動(dòng)手性,降低了實(shí)驗(yàn)中非核心內(nèi)容的實(shí)踐難度。事實(shí)上,基于MATLAB與C/C++混合編程的模式是解決工程與研究問(wèn)題的一種有效方法,已在機(jī)械動(dòng)態(tài)仿真[8]、電力系統(tǒng)負(fù)荷計(jì)算[9]、圖像處理[10]等方面得到廣泛應(yīng)用。學(xué)生通過(guò)實(shí)踐基于MATLAB與C/C++混合編程的數(shù)字圖像處理實(shí)驗(yàn),將使其掌握這種在工程項(xiàng)目開(kāi)發(fā)中的先進(jìn)技術(shù)。
MATLAB與C/C++混合編程分為兩類:MATLAB調(diào)用C/C++和C/C++調(diào)用MATLAB。主要關(guān)注MATLAB調(diào)用C/C++的方法,C/C++調(diào)用MATLAB的方法本文不涉及,相關(guān)內(nèi)容可參閱文獻(xiàn)[11]。在MATLAB環(huán)境下調(diào)用C/C++程序需要借助MATLAB編譯器將C/C++程序編譯為MEX(MATLAB Executable)文件,然后在MATLAB命令提示符下鍵入MEX文件的文件名就完成了對(duì)C/C++程序的間接調(diào)用。圖1以example.c的C/C++程序?yàn)槔?,說(shuō)明整個(gè)流程。
圖1 MATLAB環(huán)境下調(diào)用C/C++程序的流程Figure 1 The flow of calling a C/C++program in MATLAB
C/C++程序需要包括兩個(gè)指定的部分:頭文件信息,#include“mex.h”;入口函數(shù):mexFunction。mex-Function函數(shù)的作用與C/C++中main函數(shù)的功能類似,它是MATLAB與C/C++語(yǔ)言之間的接口。例如,在文件example.c中寫入圖2中的C/C++代碼,然后在MATLAB中執(zhí)行命令mex example.c,則在與文件example.c相同的目錄下就生成了example.mexw64文件,這是編譯成功的MEX文件。
圖2 example.c文件Figure 2 The file of example.c
mexFunction函數(shù)中的參數(shù)含義有如下4點(diǎn)。1)int nlhs:輸出參數(shù)的個(gè)數(shù);2)mxArray*plhs[]:輸出參數(shù)的mxArray數(shù)組;3)int nrhs:輸入?yún)?shù)的個(gè)數(shù);4)mxArray*prhs[]:輸入?yún)?shù)的mxArray數(shù)組。假設(shè)在MATLAB環(huán)境中調(diào)用example函數(shù):[Out1,Out2]=example(In1,In2,In3)。則example函數(shù)輸入?yún)?shù)的對(duì)應(yīng)關(guān)系是:prhs[0]←In1,prhs[1]←In2,prhs[2]←In3;example函數(shù)輸出參數(shù)的對(duì)應(yīng)關(guān)系是:plhs[0]→Out1,plhs[1]→Out2;nlhs是2,nrhs是3。用C/C++編寫代碼的關(guān)鍵之處在于mexFunction函數(shù)中MATLAB與C/C++之間的數(shù)據(jù)交換。MATLAB規(guī)定所有數(shù)據(jù)類型均可用mxArray描述,并且mexFunction函數(shù)的所有輸入輸出參數(shù)均采用mxArray來(lái)定義。MATLAB提供多個(gè)以mex為前綴的API將mxArray類型的數(shù)據(jù)轉(zhuǎn)化為C/C++可直接使用的基本數(shù)據(jù)類型,如int、char、double等[11]。MATLAB調(diào)用C/C++的規(guī)范簡(jiǎn)單易懂,學(xué)生動(dòng)手實(shí)驗(yàn)幾個(gè)實(shí)例之后就可掌握。
目前開(kāi)設(shè)數(shù)字圖像處理課程的理工科專業(yè)越來(lái)越多,涵蓋了計(jì)算機(jī)工程、電子工程、自動(dòng)化、數(shù)字媒體等。根據(jù)人才培養(yǎng)方案的目標(biāo),不同專業(yè)安排的實(shí)驗(yàn)教學(xué)課時(shí)通常在10~24課時(shí)之間。為兼顧基本知識(shí)面與擴(kuò)展知識(shí)點(diǎn),將實(shí)驗(yàn)內(nèi)容分成8個(gè)實(shí)驗(yàn)單元,每個(gè)實(shí)驗(yàn)單元的課時(shí)為2~4個(gè)。8個(gè)實(shí)驗(yàn)單元中的6個(gè)單元構(gòu)成實(shí)驗(yàn)的基本模塊,2個(gè)單元構(gòu)成實(shí)驗(yàn)的進(jìn)階模塊,教師可根據(jù)學(xué)生專業(yè)需求安排具體的實(shí)驗(yàn)單元(圖3)。
圖3 數(shù)字圖像處理實(shí)驗(yàn)的內(nèi)容Figure 3 The content of digital image processing experiments
8個(gè)單元涵蓋的實(shí)驗(yàn)內(nèi)容如下:
1)圖像點(diǎn)運(yùn)算模塊,線性變換、閾值變換、窗口變換和灰度拉伸等;
2)圖像幾何變換模塊,圖像平移、圖像縮放、圖像鏡像變換和圖像旋轉(zhuǎn)等;
3)圖像頻域變換模塊,傅里葉變換、離散余弦變換、沃爾什變換、哈達(dá)瑪變換和小波變換等;
4)圖像編碼模塊,哈夫曼編碼、香農(nóng)編碼、行程編碼、算術(shù)編碼和JPEG編碼等;
5)圖像恢復(fù)模塊,逆濾波、Wiener濾波、約束最小二乘濾波和盲解卷積等;
6)圖像增強(qiáng)模塊,空間濾波、圖像平滑、圖像銳化、頻域?yàn)V波和偽彩色增強(qiáng)等;
7)圖像分割模塊,基于閾值的分割、基于邊緣的分割和基于區(qū)域的分割等;
8)圖像特征提取模塊,圖像幾何特征描述、圖像形狀特征描述和圖像區(qū)域特征描述等。
考慮到不同專業(yè)的實(shí)踐要求,實(shí)驗(yàn)可按圖4所示的雙軌制方法進(jìn)行。例如,對(duì)于計(jì)算機(jī)工程專業(yè)的學(xué)生,采用MATLAB與C/C++混合編程的方法進(jìn)行實(shí)驗(yàn),并將實(shí)驗(yàn)結(jié)果與直接調(diào)用MATLAB數(shù)字圖像處理工具箱中API的運(yùn)行結(jié)果進(jìn)行對(duì)比,以加深對(duì)算法原理的理解。對(duì)于數(shù)字媒體專業(yè)的學(xué)生,只需調(diào)用MATLAB數(shù)字圖像處理工具箱中的API進(jìn)行實(shí)驗(yàn),以使他們對(duì)算法原理和處理結(jié)果有直觀理解,而不過(guò)多強(qiáng)調(diào)編程技巧。
圖4 數(shù)字圖像處理實(shí)驗(yàn)的雙軌制方法Figure 4 The double-track method for digital image processing experiment
以數(shù)字圖像處理中的線性變換算法為例,按照MATLAB規(guī)范,用C/C++編寫數(shù)字圖像的線性變換程序(圖5),然后將該程序與MATLAB數(shù)字圖像處理工具箱的API函數(shù)imadjust進(jìn)行對(duì)比,觀察它們對(duì)同一組輸入?yún)?shù)的輸出結(jié)果。實(shí)驗(yàn)步驟如下:
1)創(chuàng)建名為testMEX.c的文件,然后在其中寫入下述步驟2、3的代碼;
2)用C/C++編寫數(shù)字圖像處理函數(shù)imadjustbyC,其函數(shù)形式參考API函數(shù)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)。參數(shù)double*img指向存放圖像數(shù)據(jù)的首地址,int len是圖像數(shù)據(jù)包含的像素個(gè)數(shù),double low_in、double hig_in、double low_out、double hig_out與imadjust中的含義一致;
3)按照MATLAB規(guī)范,編寫固定頭格式的函數(shù)void mexFunction(int nlhs,mxArray*plhs[],int nrhs,constmxArray*prhs[])。該函數(shù)把輸入的數(shù)據(jù)轉(zhuǎn)化為C/C++可識(shí)別的格式,然后再調(diào)用imadjustbyC函數(shù)對(duì)轉(zhuǎn)換格式后的輸入數(shù)據(jù)進(jìn)行處理,最后將處理結(jié)果按MATLAB規(guī)范返回。這其中用到的函數(shù)mxGetM、mxGetN、mxGetPr、mxCreateDoubleMatrix均是MATLAB提供的API,細(xì)節(jié)可參閱MATLAB的外部程序接口手冊(cè)[12];
4)在MATLAB中輸入命令mex testMEX.c,編譯成功后,生成了可在MATLAB環(huán)境中直接調(diào)用的模塊testMEX.mexw64;
5)調(diào)用testMEX.mexw64和imadjust對(duì)數(shù)字圖像處理實(shí)驗(yàn)中的一幅標(biāo)準(zhǔn)圖片(圖6a)進(jìn)行處理,對(duì)比實(shí)驗(yàn)結(jié)果。調(diào)用語(yǔ)句如下:
>>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給出了兩種方法的處理結(jié)果。為比較這兩個(gè)結(jié)果是否一致,首先將矩陣B和D相減,然后輸出其中絕對(duì)值最大的元素。命令語(yǔ)句如下:
電力系統(tǒng)負(fù)荷計(jì)算研究[J].大連海事大學(xué)學(xué)報(bào),2013,39(1):103-106.
[10]范芳蕾,李亮玉,周鑫,等.基于VC++與Matlab混合編程的焊接熔池圖像處理[J].天津工業(yè)大學(xué)學(xué)報(bào),2007,26(4):51-53.
[11]劉維.精通Matlab與C/C++混合程序設(shè)計(jì)[M]四版.北京:北京航天航空大學(xué)出版社,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.
(責(zé)任編輯:葉麗娜)
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
武夷學(xué)院引進(jìn)人才科研啟動(dòng)項(xiàng)目(YJ201607)。
魏毅(1978-),男,漢族,講師,主要從事虛擬現(xiàn)實(shí)的研究。