?

面向教學的可視化圖像處理編程語言設計

2017-05-12 15:34郭斯羽溫和孟志強
中國教育信息化·基礎教育 2017年4期
關鍵詞:數字圖像處理

郭斯羽 溫和 孟志強

摘 要: 針對學生對《數字圖像處理》課程內容感到抽象,對編程存在一定畏難情緒的狀況,提出利用可視化編程來提高學生對數字圖像處理實踐的參與程度。為此設計了一種基于XML的圖像處理可視化編程語言,為圖像處理任務的可視化編程打下了基礎。語言定義了圖像處理功能模塊和程序的結構,以包含可視化實現圖像處理流程的必要信息;給出了針對該語言的翻譯器的基本原理與關鍵步驟,能將可視化程序翻譯為m文件,從而能在MATLAB環境中執行?;谒O計的語言和翻譯器能夠實現可視化圖像處理程序設計軟件,并可引入不同難度層次的圖像處理編程訓練,有助于學生掌握和運用《數字圖像處理》課程的相關方法和技術。

關鍵詞: 數字圖像處理;可視化編程;XML;MATLAB

中圖分類號: G434 文獻標志碼:A 文章編號:1673-8454(2017)08-0093-04

一、可視化圖像處理編程語言的設計目的

《數字圖像處理》是電子信息類專業一門重要的專業課,因其與機器視覺具有密切關系,在我國制造業升級的大環境下,該課程的教學更具有了重要的意義?!稊底謭D像處理》實踐性強,因此針對本課程的演示實驗和學生動手的課程實驗,已經有許多研究者基于諸如Visual C++[1]、OpenCV[2,3]、ImageJ[4]、DSP[5,6]以及MATLAB[7-9]等不同軟件和技術提出了實驗教學的方案。但從學生實際情況來看,若僅提供操作界面,通過菜單和按鈕操作來觀察圖像處理方法的效果,雖然能適應多數學生的水平,也能幫助直觀了解有關方法的效果,但對方法的編程實現訓練不足;但若使用某種編程語言來進行實驗,哪怕是使用OpenCV或MATLAB這類直接支持圖像處理的語言,仍會使相當部分的學生產生畏難情緒,且在實現過程中易于陷入語言本身的細節問題,難以專注于對特定圖像處理應用的整體框架性理解。

在多年的教學過程中,學生普遍對可視化的編程工具表現出新奇感,較少產生畏難情緒,實驗的參與度普遍較高。除此之外,可視化編程本身的框圖特性,能夠直觀便捷地描述出算法的主要步驟和流程。因此,本文設計了一種MATLAB環境下用于數字圖像處理的可視化編程語言xGIPL(XML-based Graphical Image Processing Language),它將相關實現代碼封裝為圖像處理“功能模塊”,使學生可以將注意力集中在整體算法步驟的理解上,而不用擔心語言細節?;谠撜Z言,可以開發面向圖像處理的可視化編程軟件,其用戶界面和操作類似于Simulink,即通過圖形化模塊設計界面或直接書寫所需要的XML模塊文件,來預先實現好所需的圖像處理步驟的功能,如圖像的二值化、顏色空間轉換、常用的濾波操作、區域標記和特征提取等等,然后由用戶在可視化編程界面中通過拖放、刪除、連接模塊以及圖形化的設置模塊參數等操作,實現完整的圖像處理任務的編程,之后可視化編程軟件將負責分析和解釋所實現的圖形化程序,將其翻譯為MATLAB m文件函數,并自動在MATLAB執行程序和返回處理結果。

二、圖像處理功能模塊的設計

圖像處理功能模塊(Image Processing Module,IPM)是具有輸入和輸出、完成特定圖像處理步驟的基本編程單元。在可視化編程界面中,每個IPM就是一個可獨立增減、拖拽并能夠與程序的其他部分通過連線相連接的實體。IPM的定義由IPM文件給出。我們用XML語言來定義模塊,因為XML語言本身具有靈活性和易讀性,能夠自由地定義所需的內容;XML的編輯很方便,通過普通的文本編輯器即可進行;此外在很多開發環境中,都有現成的XML解析器可用,從而大大方便了IPM和可視化圖像處理程序的翻譯過程。

1.IPM的具體設計

每個IPM的XML結構中包含一個名為“ipmod”的根節點,其下包含如下子節點:①mod_name節點。給出了每個IPM在模塊庫中的全局唯一的標識,且與IPM的XML文件名相同;②mod_help節點。提供了本IPM的幫助信息,可在可視化編程界面中為用戶提供模塊的用法;③glyph節點。用于指定一個圖片文件路徑,以便在可視化編程界面中提供更加直觀和美觀的模塊外觀;④parent_group節點。用于以樹狀結構組織和管理眾多IPM構成的模塊庫;⑤port_pos節點。用于指定可視化界面中IPM的輸入輸出端口出現的位置。port_pos又包含兩個子節點:inport_pos節點和outport_pos節點,分別指定了輸入端口和輸出端口的位置;⑥inputs節點和outputs節點。分別用于定義與IPM的輸入和輸出有關的信息。在inputs節點和outputs節點之下,又分別可包含一個或多個inport節點和outport節點,它們具體定義了每個輸入端口和輸出端口,其結構稍后介紹。inputs節點和outputs節點為可選節點,即一個IPM可以沒有輸入(沒有inputs節點)或沒有輸出(沒有outputs節點),但不能兩者均無;⑦implement節點。給出了實現本IPM的處理功能的MATLAB代碼。

inputs節點下的inport節點及outputs節點下的outport節點定義了IPM的各輸入、輸出端口,相當于IPM的輸入和輸出參數。inport節點和outport節點均包含如下子節點:

(1)port_name節點。給出了該端口在IPM內的唯一名稱,并且在IPM的implement代碼中通過“%port_name”的方式加以引用。

(2)port_help節點。給出了該端口的幫助性文本。

此外,inport節點還包含:

(3)可選的value_range節點。當一個inport節點包含value_range節點時,表示該端口的取值有一定的范圍限制,因此在可視化界面中可以采用適當的方式(如滾動條或下拉菜單等)更方便地加以設定。輸入端口的取值范圍又可采用如下三種形式之一:①整數取值范圍。用value_range節點下的int_range子節點表示,而int_range下又含一個max子節點和一個min子節點,分別給出可選的整數值的上下限;②實數取值范圍。用real_range子節點表示,其下同樣包含一個max和一個min子節點來給出上下限;③類別型取值范圍。用cat_set字節點表示,其下包含若干cat子節點,每個cat子節點的值一般為一個MATLAB字符串。

(4)可選的default節點。表明當該輸入端口未與其他模塊的輸出端口相連,也沒有通過用戶編輯來設置一個值時,該端口的缺省取值。若存在default節點,則表明該輸入是可選參數,否則輸入是必選參數,必須由用戶通過上述兩種方式之一為其提供所需的值。

2.IPM示例

下面以一個示例性的ReadImage IPM的XML文件來說明所定義的結構。ReadImage模塊定義的代碼如下,為簡潔起見,其中略去了mod_help、glyph、port_pos、parent_group和port_help等非核心節點:

ReadImage

Path

Format

'Auto-determined'

'bmp'

'jpeg'

...

'Auto-determined'

ImageData

if strcmp(%Format, 'Auto-determined')

%ImageData = imread(%Path);

else

%ImageData = imread(%Path, %Format);

end

由上述代碼可見,ReadImage模塊包含兩個輸入端口——Path端口和Format端口。Path端口用于指定待讀取的圖像文件的路徑,是必選端口,需要用戶在可視化編程的模塊編輯界面中輸入或通過其他模塊傳入;Format端口用于指定圖像文件的格式,具有類別型的取值范圍,指出了模塊支持的圖像文件格式,而缺省值為“Auto-determined”,即模塊根據文件后綴名自動確定圖像文件格式。輸出端口只有一個,即ImageData端口,是所讀取到的圖像數據矩陣。在implement節點中可以看到模塊功能的實現代碼。

三、可視化圖像處理程序的結構設計

1.圖像處理程序的設計

在可視化編程界面上放置、拖拽和連接IPM的實例,即可構成圖像處理程序(Image Processing Program,IPP)。我們同樣利用XML來作為程序源代碼的組織方式。圖像處理程序的XML根節點是“ipprog”節點,其下包括1個memo節點和若干個block節點。memo節點僅是對IPP的描述和介紹,而構成IPP實質功能的部分是block節點。

block節點包含如下子節點:

(1)block_name節點。block_name是程序中每個IPM實例在IPP范圍內的唯一標識。一個IPM可能在一個IPP中有多個實例,但這些實例必須具有不同的block_name。

(2)module節點。儲存了該IPM實例所使用的IPM的名字,即IPM定義中的mod_name。

(3)inputs節點。儲存了該IPM實例的輸入值的信息。inputs節點下包含一個或多個inport節點,每個inport節點描述了相應的輸入端口的輸入值信息,由如下子節點構成:①port_name節點。輸入端口的端口名,即IPM定義中的port_name;②value_type節點。value_type節點的可能取值為“internal”或“external”。internal表示該端口的輸入值是由用戶在模塊編輯界面中輸入而來,并非來自其他IPM實例的輸出;external則表示該端口的輸入值由其他IPM實例的輸出所提供;③value節點。當value_type為internal時,用戶提供的輸入值儲存于value節點中;當value_type為external時,則不應出現value節點;④src_block節點和src_outport節點。當value_type為external時,src_block節點儲存了該輸入端口的輸入所來自的那個IPM實例的名字,即前述的block_name;src_outport節點指出了所來自的該IPM實例的具體輸出端口名。通過src_block和src_outport便隱含地描述了IPM間的連接情況。當value_type為internal時,不應出現src_block和src_outport節點。

2.IPP示例

我們通過如下示例IPP來進行說明:

This is an examplar application diagram.

writer

SaveImage

ImageIn

external

reader

ImageData

Path

internal

'result.jpg'

Format

internal

'Auto-determined'

reader

ReadImage

Path

internal

'image1.jpg'

Format

internal

'Auto-determined'

這個簡單的程序包括兩個IPM實例:reader和writer。reader模塊是一個ReadImage IPM,在程序的輸入設置下由“image.jpg”文件讀入圖像;writer模塊是一個SaveImage IPM,在程序的輸出設置下將reader讀入的圖像數據再保存為圖像文件“result.jpg”。

四、可視化圖像處理程序翻譯器

可視化圖像處理程序翻譯器的作用,是將IPP自動轉為可在MATLAB中執行的.m函數文件。翻譯器的基本工作思路是首先對IPM和IPP的XML文件進行解析,獲取各個XML節點信息,然后以系統性的編碼和命名方式來產生所需的.m文件。

在完成XML文件解析后,先根據程序所用各IPM的implement元素,以子函數形式封裝這些代碼。封裝的主要思路是,利用IPM名作為子函數名,采用系統性的方法定義輸入輸出的變量名,例如對于第1個輸入,可以定義為“in1__”。在定義了輸入輸出的變量名后,將implement代碼中以%port_name形式給出的輸入輸出變量替換為所生成的變量名。

整個IPP的翻譯則首先需要對IPM實例按調用的邏輯順序進行排序。程序要能夠執行,要求每個IPM實例(所對應的子函數)在被調用前,其輸入都已確定。因此我們需要對IPM實例排序??紤]到IPM實例數量通常不大,我們重復地遍歷這些IPM實例,并對它們進行標號。開始時,所有IPM實例的標號均為0。如果一個IPM實例的某個輸入端口的value_type為internal,或者該端口為external,但與其連接的src_block IPM實例已經被標號,那么這個輸入端口的值就已經確定;如果一個IPM實例沒有輸入端口,或者所有輸入端口的值均已確定,那么就用一個大于0的整數值標號該IPM實例。當所有IPM實例均被標號,或者在一次遍歷中沒有IPM實例被標號,那么整個排序過程即告完成。

之后,按標號由小到大的順序將每個IPM實例轉為對相應子函數的調用代碼,并采用系統性的方法來命名IPM實例的輸入輸出端口對應的變量,最后以程序文件名作為函數名,為翻譯好的代碼加上MATLAB函數定義頭,并保存為同名的.m文件,便完成了翻譯。

例如,經過翻譯之后,由第二節中示例IPM所得的子函數以及第三節中示例IPP對該子函數進行調用的MATLAB代碼如下:

function example()

reader_Path_in__ = 'image1.jpg';

Reader_Format_in__ = 'Auto-determined';

[reader_ImageData_out__] = ReadImage

(reader_Path_in__,reader_Format_in__);

function [out1__] = ReadImage(in1__, in2__)

if strcmp(in2__, 'Auto-determined')

out1__ = imread(in1__);

else

out1__ = imread(in1__, in2__);

end

五、開展圖像處理編程訓練的若干層次

利用本文所設計的xGIPL可視化圖像處理編程語言,可以開展不同層次的圖像處理編程訓練。我們目前所能考慮到的就至少包括以下三個層次:

(1)使用xGIPL在已有模塊的基礎上進行可視化編程。學生通過使用現成的IPM來進行可視化編程,能夠了解和掌握解決特定圖像處理任務的整體性思路,并能夠直觀地感受處理的效果以及程序的性能。這一層次屬于較低的訓練層次。

(2)通過MATLAB編程來自行實現關鍵的IPM,并通過可視化編程完成應用的完整實現。在該訓練層次下,學生應對MATLAB語言編程有相當程度地掌握,并且也能夠完成IPM的設計,從而能夠針對特定的圖像處理問題自行實現其中的關鍵步驟,并完成IPM的封裝。這一層次屬于中等訓練層次,能夠鍛煉學生對MATLAB這一高級編程語言的運用。

(3)通過MATLAB的C/C++ MEX編程來實現關鍵的、對于計算性能有較高要求的圖像處理功能,從而能夠更高效地完成整個圖像處理任務。這一訓練層次要求學生不但熟悉xGIPL和MATLAB語言,而且也熟悉C/C++編程,并且能夠使用C/C++語言進行圖像處理算法的低層級編程,因此屬于最高的訓練層次。

參考文獻:

[1]翁花群,林元國.基于Visual C++的數字圖像處理實驗教學軟件開發[J].廊坊師范學院學報(自然科學版),2015(1):24-28.

[2]李志欣,卓亞琦.基于OpenCV的數字圖像處理實驗教學研究[J].大學教育,2013(9):42-43.

[3]張帆.基于OpenCV實踐項目的數字圖像處理教學方法探索[J].亞太教育,2015(22):133.

[4]鄭林濤,董永生.ImageJ軟件在數字圖像處理課程教學中的應用[J].中國電力教育,2014(8):112-113.

[5]施幫利,韓武紅,楊奕.基于DSP的數字圖像基本處理實驗教學探討[J].中國電力教育,2013(10):171-173.

[6]魯億方,藍金輝,遲健男.基于DSP的數字圖像處理實驗的探究[J].實驗技術與管理,2014(3):109-113.

[7]邱廣萍.MATLABGUIDE在數字圖像處理教學中的應用[J].價值工程,2014(3):184,186.

[8]趙敏.MATLAB用于數字圖像處理的教學實踐研究[J].電腦知識與技術,2012(31):7539-7540.

[9]肖龍飛,李金龍,楊凱,etal.基于MATLAB的數字圖像處理教學軟件的設計[J].信息技術,2014(12):185-187.

(編輯:魯利瑞)

猜你喜歡
數字圖像處理
MATLAB在《數字圖像處理》課程中的輔助教學
信息與計算科學專業《數字圖像處理》課程教學探討與實踐
以應用實例為主線、以程序設計為主導的數字圖像處理課程教學方法改革
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合