董 延,黃志剛,2
(1.北京工商大學(xué) 材料與機(jī)械工程學(xué)院,北京 100048;2.北京工商大學(xué) 中國(guó)食品安全研究中心,北京 100048)
在科研過(guò)程中,許多文獻(xiàn)資料中的數(shù)據(jù)是以曲線的形式給出的。在只有曲線圖而沒(méi)有數(shù)學(xué)表達(dá)式的情況下,如果想要獲得曲線上某些點(diǎn)的坐標(biāo)值,較原始的方法是在坐標(biāo)紙上手工描點(diǎn),這種方法比較耗時(shí),且準(zhǔn)確度取決于取點(diǎn)的多少與描點(diǎn)精度。后來(lái)隨著計(jì)算機(jī)的發(fā)展,出現(xiàn)了一些專(zhuān)用圖像處理軟件,在這類(lèi)軟件中,通過(guò)在圖像上手工取點(diǎn),再用曲線擬合的方法將各點(diǎn)連接,以提取出原始曲線。但是這種方法的準(zhǔn)確度會(huì)受到取點(diǎn)的位置、數(shù)量以及所選擇的擬合算法的影響。
本文提出一種基于Matlab 的圖像處理技術(shù)提取圖像中的曲線的新方法。創(chuàng)新處是在提取的過(guò)程中使用了圖像的形態(tài)學(xué)運(yùn)算,使得本方法只需選擇較少的點(diǎn),就能夠快速、準(zhǔn)確地將圖像中的曲線提取出來(lái)。同時(shí)克服了圖像背景對(duì)曲線提取產(chǎn)生的干擾。
Matlab 中的數(shù)字圖像是以矩陣形式表示的,這意味著其強(qiáng)大的矩陣運(yùn)算能力用于圖像處理非常有利,矩陣運(yùn)算的語(yǔ)法對(duì)Matlab 中的數(shù)字圖像同樣適用。
MathWorks 公司針對(duì)不同領(lǐng)域的應(yīng)用,推出了30 多個(gè)具有專(zhuān)門(mén)功能的工具箱。這些工具箱都是由該領(lǐng)域內(nèi)的專(zhuān)家編寫(xiě)的,用戶(hù)可直接對(duì)工具箱內(nèi)的函數(shù)進(jìn)行調(diào)用,而無(wú)需自己編寫(xiě)所用的專(zhuān)業(yè)基礎(chǔ)程序。
Matlab 圖像處理工具箱(Image Processing Toolbox)專(zhuān)為數(shù)字圖像處理而開(kāi)發(fā)。它提供了一套全方位的參照標(biāo)準(zhǔn)算法和圖形工具,用于進(jìn)行圖像處理、分析、可視化和算法開(kāi)發(fā)。可進(jìn)行圖像增強(qiáng)、圖像去模糊、特征檢測(cè)、降噪、圖像分割、空間轉(zhuǎn)換和圖像配準(zhǔn)。該工具箱中的許多功能支持多線程,可發(fā)揮多核和多處理器計(jì)算機(jī)的性能。
Matlab 圖像處理工具箱函數(shù)包括: 圖像顯示函數(shù)、圖像文件輸入、輸出函數(shù)、圖像幾何操作函數(shù)、圖像像素值及統(tǒng)計(jì)函數(shù)、圖像分析函數(shù)、圖像增強(qiáng)函數(shù)、線性濾波函數(shù)、二維線性濾波器設(shè)計(jì)函數(shù)、圖像變換函數(shù)、圖像鄰域及塊操作函數(shù)、二值圖像操作函數(shù)、基于區(qū)域的圖像處理函數(shù)、顏色圖操作函數(shù)、顏色空間轉(zhuǎn)換函數(shù)、圖像類(lèi)型和類(lèi)型轉(zhuǎn)換函數(shù),共15 類(lèi)[1]。Matlab 圖像處理工具箱支持四種圖像類(lèi)型。這四圖像類(lèi)型分別為RGB 圖像、索引圖像、灰度圖像和二值圖像。這四種類(lèi)型可以用工具箱的類(lèi)型轉(zhuǎn)換函數(shù)相互轉(zhuǎn)換。
(1) 彩色圖像。Matlab 可處理的彩色圖像包括RGB圖像和索引圖像。一幅RGB 圖像在Matlab 中是一個(gè)M×N×3 的三維數(shù)組。前二維M 和N 分別為數(shù)組的行數(shù)和列數(shù),第三維則表示R、G、B 三個(gè)分量的值??梢詫⑦@個(gè)三維數(shù)組看作三個(gè)M×N×1 的二維數(shù)組的疊加。這三個(gè)二維數(shù)組分別表示這幅圖像各像素點(diǎn)的R、G、B分量,相同位置的元素對(duì)應(yīng)同一像素。各分量的取值取決于數(shù)組的數(shù)據(jù)類(lèi)型。例如,當(dāng)數(shù)據(jù)類(lèi)型是double 時(shí),取值范圍是[0,1];當(dāng)數(shù)據(jù)類(lèi)型是uint8 時(shí),取值范圍是[0,255]。索引圖像在Matlab 中則由一個(gè)M×N 的數(shù)組和一個(gè)m×3 的數(shù)組共同表示,其中M 和m 不一定相等。M×N 數(shù)組中的每個(gè)元素對(duì)應(yīng)圖像中相同位置的像素,元素的值n 則指向m×3 數(shù)組中的第n 行,即該位置的像素的R、G、B 值分別由m×3 數(shù)組中的第n 行的三個(gè)值來(lái)確定。
(2) 灰度變換。灰度圖像的每個(gè)像素只有一個(gè)灰度值,因此灰度圖像是一個(gè)M×N 的二維數(shù)組。將彩色圖像變換為灰度圖像,方法是取彩色圖像中每個(gè)像素的R、G、B 分量值的均值,做為該像素的灰度值。
Matlab 中將RGB 圖像轉(zhuǎn)換為灰度圖像的語(yǔ)法是I=rgb2gray(RGB);將索引圖像轉(zhuǎn)換為灰度圖像的語(yǔ)法是I=ind2gray(X,map)。
(3)二值變換。二值圖像在Matlab 中也是一個(gè)M×N的二維數(shù)組,但其數(shù)據(jù)類(lèi)型是logical,因此其元素只取0 或1。0 表示背景像素(黑色),1 表示前景像素(白色)。將灰度圖像轉(zhuǎn)換為二值圖像的語(yǔ)法是BW=im2bw(I,level)。
(4)數(shù)字圖像的形態(tài)學(xué)運(yùn)算。圖像的形態(tài)學(xué)運(yùn)算是指:用具有一定形態(tài)的結(jié)構(gòu)元素去量度和提取圖像中的對(duì)應(yīng)形狀,以達(dá)到對(duì)圖像分析和識(shí)別的目的。數(shù)學(xué)形態(tài)學(xué)的應(yīng)用可以簡(jiǎn)化圖像數(shù)據(jù),保持它們基本的形狀特性,并除去不相干的結(jié)構(gòu)。與本文所述方法相關(guān)的形態(tài)學(xué)運(yùn)算有形態(tài)學(xué)細(xì)化和形態(tài)學(xué)重構(gòu)。
形態(tài)學(xué)細(xì)化可將二值圖像中無(wú)孔的連續(xù)對(duì)象細(xì)化為不間斷的線,且保留對(duì)像原始的形狀;將有孔的連續(xù)的對(duì)象縮小為環(huán),且保留對(duì)像原始的形狀。Matlab 語(yǔ)法是BW2=bwmorph(BW,’thin’,n)。
形態(tài)學(xué)重構(gòu)包括兩幅圖像和一個(gè)結(jié)構(gòu)元。一幅圖像是標(biāo)記,是變換的開(kāi)始點(diǎn);另一幅圖像是模板,用于約束變換過(guò)程。[2]Matlab 語(yǔ)法是IM=imreconstruct(marker,mask)。
作為面向科學(xué)與工程計(jì)算的大型科技應(yīng)用軟件,Matlab 同樣提供了一功能強(qiáng)大的用于編寫(xiě)圖形用戶(hù)界面的工具: 圖形用戶(hù)界面 (Graphical User Interface,GUI)。其界面(GUI)是由各種圖形對(duì)象如窗口、光標(biāo)、按鍵、菜單、文字說(shuō)明等對(duì)象構(gòu)成的一個(gè)用戶(hù)界面。用戶(hù)通過(guò)一定的方法(如鼠標(biāo)或鍵盤(pán))選擇、激活這些圖形對(duì)象,可以使計(jì)算機(jī)產(chǎn)生某種動(dòng)作或變化,如實(shí)現(xiàn)計(jì)算、繪圖等[3]。
在該界面內(nèi),用戶(hù)可以根據(jù)界面提示完成整個(gè)工程,卻不必去了解工程內(nèi)部是如何工作的。
Matlab 圖形用戶(hù)界面設(shè)計(jì)的第一步是對(duì)控件進(jìn)行布局,這是通過(guò)對(duì)各種圖形對(duì)象的操作來(lái)實(shí)現(xiàn)的。它的設(shè)計(jì)方法有兩種: 編寫(xiě)程序和使用GUIDE。編寫(xiě)程序的方法要求使用者深入了解各種圖形對(duì)象的特征、屬性和操作;而使用GUIDE 則使用者通過(guò)鼠標(biāo)就可以生成各種GUI 控件并改變它們的外觀和位置。第二步是編制菜單、控件的回調(diào)函數(shù),這是圖形用戶(hù)界面設(shè)計(jì)的重點(diǎn)。回調(diào)函數(shù)就是當(dāng)程序接受到某個(gè)Windows 動(dòng)作,如鼠標(biāo)單擊、鍵盤(pán)輸入的時(shí)候,為所希望進(jìn)行的操作所指定的函數(shù)。該函數(shù)是由主控程序調(diào)用的。主控程序?qū)Ω鞣N消息進(jìn)行分析,排隊(duì)和處理,最后去調(diào)用指定的回調(diào)函數(shù)。
圖1 為基于Matlab GUI 所編寫(xiě)的曲線提取程序的主界面。點(diǎn)擊右側(cè)下方的 “打開(kāi)圖像” 按鈕,將會(huì)彈出文件選擇對(duì)話框,該對(duì)話框的形式和操作與Windows 的文件選擇對(duì)話框相同,不再贅述。
現(xiàn)以某發(fā)動(dòng)機(jī)外特性曲線圖為例。打開(kāi)圖像后,該圖像會(huì)如圖1 顯示在主界面左側(cè)。該圖像的背景較復(fù)雜(有顏色較深的坐標(biāo)網(wǎng)格線),對(duì)于曲線的正確提取會(huì)產(chǎn)生干擾。對(duì)于這類(lèi)圖像,應(yīng)用本文所述的方法可將曲線準(zhǔn)確地提取出來(lái)。
下面就以圖1 左側(cè)所示的某發(fā)動(dòng)機(jī)外特性曲線圖為例,結(jié)合Matlab GUI 程序的使用方法說(shuō)明曲線的提取過(guò)程。
圖1 GUI 主界面Fig.1 The main interface of GUI
讀入需要提取的原始圖像后,首先是對(duì)圖像進(jìn)行灰度處理。包括灰度變換和灰度閾值的設(shè)定。點(diǎn)擊主界面右側(cè)下方的 “灰度轉(zhuǎn)換” 按鈕,程序會(huì)將原彩色圖像轉(zhuǎn)換為灰度圖像。轉(zhuǎn)換為灰度圖像后,可對(duì)灰度閾值進(jìn)行設(shè)置。主界面 (圖1) 右側(cè)的最上方是 “灰度圖閾值調(diào)整” 面板??梢杂脙蓚€(gè)滑動(dòng)條調(diào)整灰度圖的最小和最大閾值。所有灰度值小于最小閾值或大于最大閾值的像素將會(huì)被過(guò)濾掉。合理地調(diào)整閾值可以去掉圖像中無(wú)關(guān)的部分。
在這幅圖像中有兩條曲線,而需要提取的是上方的曲線,如圖2 所示。當(dāng)灰度圖閾值的最小和最大值分別被設(shè)定為48 和114 時(shí),圖像中的大部分干擾像素(如坐標(biāo)網(wǎng)格線和下方的曲線)都被去掉或變淡了。
圖2 灰度處理效果Fig.2 The effect of gray processing
下一步是將灰度圖像變換為二值圖像。在點(diǎn)擊主界面右側(cè)下方的 “二值轉(zhuǎn)換” 按鈕后,程序會(huì)完成三步操作: 第一步,將灰度圖像轉(zhuǎn)換為二值圖像;第二步,將二值圖像形態(tài)學(xué)細(xì)化;第三步,刪除二值圖所有的交叉。例如,曲線與背景坐標(biāo)格相交叉處的像素將會(huì)被刪除。因此,曲線在與坐標(biāo)格相交的地方會(huì)斷開(kāi)。這是為后面的形態(tài)學(xué)重構(gòu)做準(zhǔn)備。
經(jīng)過(guò)2.2 中的處理后,由于曲線在與背景坐標(biāo)格的交點(diǎn)處會(huì)被斷開(kāi),因此曲線會(huì)被分為幾段。只需在每段曲線上任選一點(diǎn),之后進(jìn)行形態(tài)學(xué)重構(gòu),就可將曲線提取出來(lái)。現(xiàn)選如圖3(為使圖片清晰,圖3 中的線條已被加粗)所示的7 個(gè)點(diǎn)。
圖3 選點(diǎn)Fig.3 Points selection
表1 點(diǎn)的位置Tab.1 Points position
這7 個(gè)點(diǎn)在圖像中的位置見(jiàn)表1。首先在程序主界面的 “選點(diǎn)” 面板中輸入第一個(gè)點(diǎn)在圖像中的位置: X:112,Y:413,然后點(diǎn)擊 “選定”,這時(shí)程序會(huì)針對(duì)該點(diǎn)做形態(tài)學(xué)重構(gòu)運(yùn)算。該運(yùn)算可以將與選定點(diǎn)相連的全部像素還原,在這里也就是將該點(diǎn)所在的曲線段還原。在2.2 節(jié)中,已將曲線與背景坐標(biāo)格相交叉處的像素刪除,這就使曲線與背景線條斷開(kāi),因此在形態(tài)學(xué)重構(gòu)時(shí)不會(huì)將背景線條還原。這樣就可得到第1 點(diǎn)所在的曲線段。同樣,在輸入其余各點(diǎn)在圖像中的坐標(biāo)后,點(diǎn)擊“選定”,就可得到全部曲線。如圖4 所示。
圖4 曲線圖像提取結(jié)果Fig.4 The extraction results of curve image
雖然已將曲線從圖像中提取出來(lái),但此時(shí)得到的只是曲線上各點(diǎn)在圖像中的位置而不是在坐標(biāo)系中的值。因此還要將各點(diǎn)像素在圖像處的行值與列值換算成坐標(biāo)值。因?yàn)樵趯?shí)際的曲線中,一個(gè)橫坐標(biāo)值只能對(duì)應(yīng)一個(gè)縱坐標(biāo)值。所以在圖4中,當(dāng)一列中有多個(gè)像素點(diǎn)時(shí),則取他們行值的均值。之后進(jìn)行換算,換算公式為:
式中: xn—第n 個(gè)點(diǎn)的橫坐標(biāo);xmin—曲線左端點(diǎn)的橫坐標(biāo);xmax—曲線右端點(diǎn)的橫坐標(biāo);cn—曲線上第n 個(gè)點(diǎn)所在的列數(shù);cmin—曲線左端點(diǎn)所在的列數(shù);cmax—曲線右端點(diǎn)所在的列數(shù);yn—曲線上第n 個(gè)點(diǎn)的縱坐標(biāo);ymin—曲線縱坐標(biāo)的最小值;ymax—曲線縱坐標(biāo)的最大值;rn—曲線上第n 個(gè)點(diǎn)所在的行數(shù);rmin—曲線最低點(diǎn)所在的行數(shù);rmax—曲線最高點(diǎn)所在的行數(shù)。
在主界面中分別輸入橫坐標(biāo)的最小值xmin=1000、最大值xmax=6000;縱坐標(biāo)的最小值ymin=131、最大值ymax=221,然后點(diǎn)擊 “生成曲線”,就可以得到最終的曲線,如圖5所示。同時(shí)將曲線的坐標(biāo)數(shù)據(jù)儲(chǔ)存在了curve.mat 數(shù)據(jù)文件中,方便以后隨時(shí)調(diào)用。當(dāng)在Matlab 中導(dǎo)入curve.mat 文件時(shí),可以得到其中包含的兩個(gè)1維 數(shù)組curvex 和 curvey,curvex 中的第n 項(xiàng)和curvey中的第n 項(xiàng)對(duì)應(yīng)于曲線第n個(gè)點(diǎn)的橫坐標(biāo)和縱坐標(biāo)。
圖5 提取出的最終曲線圖Fig.5 The final result of extraction
(1)這種方法的優(yōu)點(diǎn)是能夠克服圖像背景的干擾。先在灰度處理的部分通過(guò)調(diào)整灰度圖像的上下閾值,去掉背景中與曲線灰度值相差較大的部分;之后運(yùn)用形態(tài)學(xué)運(yùn)算進(jìn)一步消除掉背景中與曲線灰度值相進(jìn)的部分,如坐標(biāo)網(wǎng)格線和坐標(biāo)軸。
(2)調(diào)用數(shù)據(jù)文件并使用Matlab 的插值或曲線擬合函數(shù)得到該曲線上任意一點(diǎn)的坐標(biāo)值非常便捷。
(3)適用范圍較廣,除在文中用于提取發(fā)動(dòng)機(jī)外特性曲線外,還可在食品、塑料等工程領(lǐng)域發(fā)揮作用。如提取微生物生長(zhǎng)曲線以研究其對(duì)食品儲(chǔ)存的影響,以及提取塑料材料的應(yīng)力、黏度曲線等。
[1] 晏暉,姜鵬,陳貝. 基于Matlab 工具箱的數(shù)字圖像處理技術(shù)[J]. 微計(jì)算機(jī)信息,2010,26(29-2):214-216.
[2] Gonzalez R C,Woods R E,Eddins SL,et. 數(shù)字圖像處理的MATLAB 實(shí)現(xiàn)(第3 版)[M]. 北京:清華大學(xué)出版社,2013.
[3] 陳垚光,毛濤濤,王正林,等. 精通MATLAB GUI 設(shè)計(jì)(第3 版)[M]. 北京:電子工業(yè)出版社,2013.