駱巖紅
摘要:數(shù)字圖像處理這門課程的實踐性很強,在教學(xué)過程中,不僅做到各種圖像處理算法的詳細(xì)講解,而且還要結(jié)合實驗系統(tǒng)進(jìn)一步幫助學(xué)生形象、直觀的理解相關(guān)知識。這種教學(xué)內(nèi)容,提高了學(xué)生的學(xué)習(xí)興趣,而且把理論的學(xué)習(xí)融入到實際的問題解決中,極大的調(diào)動了學(xué)生的主動性和積極性。本文結(jié)合VC++語言,設(shè)計了一個實驗系統(tǒng),并經(jīng)過各種算法的自行設(shè)計,得以證明,系統(tǒng)達(dá)到預(yù)期的功能。
關(guān)鍵詞:數(shù)字圖像處理;軟件設(shè)計;實驗教學(xué)
中圖分類號:G434 文獻(xiàn)標(biāo)志碼:A 文章編號:1674-9324(2018)50-0277-02
一、引言
圖像處理是一門多交叉學(xué)科,它涉及了計算機、數(shù)學(xué)知識、信號處理等方面的課程,該課程要求學(xué)生掌握基本的圖像處理理論和算法。在授課過程中,常常需要結(jié)合特定的物理學(xué)、仿生學(xué)理論進(jìn)行數(shù)學(xué)理論的推導(dǎo),但是如果一味地講解相關(guān)理論和算法,就會導(dǎo)致授課過程乏味,而且給學(xué)生學(xué)習(xí)該門課程帶來很大的困難,更不要說把所學(xué)得知識和實際的應(yīng)用聯(lián)系起來。
鑒于圖像處理這門課程較強的實踐性,如果在教學(xué)過程中,結(jié)合計算機程序設(shè)計來驗證各種算法的有效性,不僅使學(xué)生較直觀地領(lǐng)會了各種算法,而且激發(fā)了學(xué)生的學(xué)習(xí)興趣和參與熱情,為培養(yǎng)學(xué)生動手實踐能力奠定了一定的基礎(chǔ)。
二、圖像處理系統(tǒng)的實現(xiàn)
圖像處理所涉及的內(nèi)容:圖像基本處理、幾何變換、圖像頻域處理、圖像增強、圖像分割和邊緣檢測、圖像復(fù)原等內(nèi)容。
1.軟件開發(fā)工具的選擇。圖像處理實現(xiàn)的手段比較多,比如Matlab、C++等開發(fā)環(huán)境,但是考慮C++語言具有良好的開發(fā)環(huán)境支持,以及VC++開發(fā)的產(chǎn)品與Windows操作系統(tǒng)具有很好的“親和力”,所以它在開發(fā)數(shù)字圖像處理方面占據(jù)著極其重要的地位。
數(shù)字圖像處理作為一門實踐性較強的課程,學(xué)生通過編程實踐來理解和領(lǐng)會圖像處理的各種算法。
2.圖像軟件設(shè)計中的技巧。雖然MFC提供了可視化的編程界面元素,但是在圖像處理方面,由于沒有提供支持DIB位圖的類,所以為了使用方便,采用了面向?qū)ο蠹夹g(shù),定義了一個與設(shè)備無關(guān)的類CImage,在該類中封裝了DIB位圖處理所需的基本成員變量和成員函數(shù)。(1)系統(tǒng)背景設(shè)置。本系統(tǒng)是建立在多文檔基礎(chǔ)上,那么對于多文檔應(yīng)用程序的背景設(shè)置,需要經(jīng)過下面的步驟:
1)用ClassWizard生成一個CWnd類的派生類CClientWnd;
2)添加消息WM_ERASEBKGND,并在其關(guān)聯(lián)的函數(shù)中OnEraseBkgnd()添加代碼:
BOOLCClientWnd::OnEraseBkgnd(CDC* pDC)
{ //定義位圖對象
//加載位圖資源,并把位圖選入內(nèi)存環(huán)境中
//位圖屏幕顯示}
3)添加WM_SIZE消息,在其關(guān)聯(lián)函數(shù)中完成窗口的重繪;
4)自定義重載的虛函數(shù)用來返回函數(shù)指針:
WNDPROC *CClientWnd::GetSuperWndProcAddr()
{static WNDPROC NEAR pfnSuper = NULL;
return &pfnSuper;;}
5)在CMainFrame類中定義一個CClientWnd 類的成員變量m_wndClient,并在CMainFrame 的OnCreate函數(shù)中把m_wndClient子類化為主框架窗口的客戶窗口。代碼如下:
if(!m_wndClient.SubclassWindow(m_hWndMDIClient))
{
TRACE("Fail to subclass MDI client window\n");
return -1;}
(2)軟件操作的設(shè)計。在軟件設(shè)計過程中,采用菜單操作的方式達(dá)到各功能的實現(xiàn)。為了代碼設(shè)計結(jié)構(gòu)的簡單和清晰,圖像處理中對同類型的菜單,使用了一個函數(shù)響應(yīng)多個選項的方法。比如在圖像特效顯示中,采用函數(shù)OnShowEffect()來處理自上而下掃描顯示、自左向右掃描顯示、柵格交錯顯示、百葉窗顯示、馬賽克顯示。具體實現(xiàn)的方法是:
1)在視圖類的頭文件中定義特效顯示的消息處理函數(shù):
afx_msg void OnShowEffect(UINT nID);
2)在視圖類的實現(xiàn)文件的開頭處,即BEGIN_MESSAGE_MAP……END_MESSAGE_MAP宏之間添加消息映射:
ON_COMMAND_RANGE(菜單選項ID,菜單選項ID,菜單響應(yīng)函數(shù))。
例如:ON_COMMAND_RANGE(ID_DOWN,
ID_MASAIK,OnShowEffect)
3)在視圖類的末端手動加入函數(shù)OnShowEffect()的定義:
void CImagProView::OnShowEffect(UINT nID)
{ ……
switch(nID)
{ case ID_UPDOWN://上到下顯示
……
break;
case ID_LEFTRIGHT://左到右顯示
……
break;
case ID_GRIDCROSS://柵格交錯顯示
……
break;
……}
這種方法,減少了代碼的冗余,另外也可以達(dá)到代碼結(jié)構(gòu)的清晰。在軟件設(shè)計中,該方法貫徹到始終,比如用OnGeometricPro()函數(shù)來完成圖像幾何處理,OnFrequencyPro()函數(shù)完成圖像的頻域處理;OnEnhancePro()函數(shù)完成圖像的增強處理;OnSepEdgePro()函數(shù)完成圖像的分割和邊緣檢測;OnRestorationPro()函數(shù)完成圖像復(fù)原。
(3)圖像處理中各算法的設(shè)計安排。該軟件設(shè)計的是由《數(shù)字圖像處理》這門課程的實驗需求而啟發(fā),為了避免課程學(xué)習(xí)過于枯燥,學(xué)生可以在該系統(tǒng)的框架中添加各算法的實現(xiàn)代碼,從而達(dá)到對其深刻地理解。
軟件已完成圖像處理總體框架的搭建,用戶可通過菜單選項調(diào)用各算法功能。但須注意,圖像處理的各種算法需要用戶自行編寫代碼。為了方便期間,要求把算法實現(xiàn)代碼放入到function.h的頭文件中,以供需要時反復(fù)調(diào)用。function.h頭文件結(jié)構(gòu):
void FFT_2D( )//二維傅立葉變換
void IFFT_2D( )//二維傅立葉逆變換
BOOL CosTran( )//離散余弦變換
……
三、總結(jié)
在數(shù)字圖像教學(xué)中,將實驗內(nèi)容和理論教學(xué)的有機結(jié)合,通過實驗改革,讓學(xué)生積極參與到實驗教學(xué)中,一方面融會貫通課堂教學(xué)內(nèi)容,另一方面通過實踐使學(xué)生對抽象的理論有了進(jìn)一步的理解。通過課題的實踐,調(diào)動了學(xué)生學(xué)習(xí)的主動性和積極性,同時也培養(yǎng)了他們程序設(shè)計思想和動手等方面的能力。
參考文獻(xiàn):
[1]魯斯著.數(shù)字圖像處理(第六版)[M].余翔宇,等譯.北京:電子工業(yè)出版社,2014.
[2]岡薩雷斯,伍茲著.數(shù)字圖像處理(第三版)[M].阮秋琦,等譯.北京:電子工業(yè)出版社,2011.