劉培軍,馬明棟,王得玉
(1.南京郵電大學 通信與信息工程學院,江蘇 南京 210003;2.南京郵電大學 地理與生物信息學院,江蘇 南京 210023)
在計算機技術(shù)如此成熟的今天,圖像處理理論與技術(shù)已經(jīng)得到了較為全面的發(fā)展并在持續(xù)不斷的優(yōu)化創(chuàng)新中,尤其在人工智能、航空航天、工業(yè)部件檢測、交通、醫(yī)學等領(lǐng)域得到了廣泛應用[1-2]。目前國內(nèi)外都有許多優(yōu)秀的圖像處理系統(tǒng)軟件,但由于這些系統(tǒng)的開發(fā)環(huán)境,應用目的和側(cè)重點不同,在實際的圖像處理過程中都出現(xiàn)了不同程度的問題,如通用性差,功能缺失,圖像處理速度慢,不能處理多種圖像格式,等等。因此根據(jù)目前研究與學習的要求設(shè)計出一種圖像處理系統(tǒng)是一種較為可行的方法。
文中詳細介紹了在Qt Creator集成開發(fā)環(huán)境下,基于OpenCV進行面向?qū)ο缶幊蹋_發(fā)的一種功能齊全,運行速度快,可擴展性強,可以在不同系統(tǒng)上運行的圖形處理系統(tǒng)。其中OpenCV計算機視覺庫作為常用的圖像處理庫之一,功能強大,支持目前先進的圖像處理技術(shù)且體系十分完善,幾乎涵蓋了近十年內(nèi)的主流算法[3]。
如今市面上存在眾多處理圖像和視頻的軟件和庫,其中OpenCV、CxImage、CImg、FreeImage是幾種常用的圖像處理庫,但是對于期望自己開發(fā)圖像處理軟件的人而言,OpenCV庫是最好的選擇。OpenCV(open source computer vision)是一個開源可跨平臺的圖像及視頻分析庫,包含500多個優(yōu)化過的算法[4-5]。自O(shè)penCV2發(fā)布后,相較于1.0版本其帶來了重要的變化,尤其是使用了嶄新的C++接口[6]。自版本2.2開始,OpenCV被劃分了多個模塊。各個模塊的名稱及功能如表1所示。
表1 OpenCV庫的主要模塊
OpenCV是一個跨平臺計算機視覺庫,需要將它編譯成二進制的靜態(tài)庫和動態(tài)庫后,才可以在IDE下直接調(diào)用圖像處理函數(shù)。編譯OpenCV需要用到開源跨平臺自動化構(gòu)建工具CMake,它可以跨平臺生成各種makefile或project文件支持用各種編譯工具生成可執(zhí)行程序或鏈接庫。Qt Creator支持CMake,因此可以用Qt Creator在圖形界面中對OpenCV進行編譯。下面是開發(fā)環(huán)境的配置過程。
(1)安裝CMake,安裝時選擇為所有用戶添加系統(tǒng)路徑,Qt Creator可以自動找到CMake,安裝MinGW版本的Qt Creator,安裝OpenCV。
(2)打開Qt Creator,工具→選項→構(gòu)建和運行→CMake,確認Qt成功找到CMake,否則手動指定CMake的路徑。
(3)在Qt中點擊[Open Project],打開OpenCV安裝目錄下的CMakeLists.txt,點擊[Configure Project]按鈕。進入[項目],編譯構(gòu)造配置選擇Release,待CMakeLists.txt讀取完畢,找到CMAKE_INSTALL_PREFIX,設(shè)置編譯完成后的輸出路徑。然后進行構(gòu)建步驟,勾選install,點擊開始構(gòu)建。最后顯示“正常退出”,表示OpenCV已經(jīng)編譯完成。文中設(shè)計的圖像處理系統(tǒng)采用Qt 5.6.0與OpenCV 2.4.12搭建開發(fā)環(huán)境。
(4)將編譯完成文件目錄下的bin文件夾路徑添加到系統(tǒng)環(huán)境變量Path中。
基于以上步驟,開發(fā)環(huán)境配置完成,在新建Qt項目.pro文件中添加頭文件路徑和靜態(tài)庫路徑以此來使用OpenCV中的圖像處理函數(shù)。
該系統(tǒng)主要由兩個核心模塊組成:圖像處理模塊與顯示模塊。圖像處理模塊作為系統(tǒng)最為重要的功能部分,主要負責接收用戶指令針對圖像進行特定處理[7];顯示模塊即在界面上顯示原始圖像或處理完成后的圖像。除了上述兩大功能模塊外,圖像的載入與保存也是該系統(tǒng)必不可少的部分。系統(tǒng)采用Qt Creator中的可視化圖像編輯器進行UI(user interface)設(shè)計,界面簡潔清晰,具有良好的交互性[8]。通過對話框操作的形式就可以實現(xiàn)對圖像進行相應的處理,而無需考慮具體實現(xiàn)原理,簡化了處理圖像的工作流程,提高了工作效率。
系統(tǒng)的基本功能主要包含文件處理、基本圖像處理、形態(tài)學處理、領(lǐng)域處理、點的處理等。
(1)文件處理:目前圖像文件的格式有許多種,文件處理主要是對這些不同格式的圖像文件進行打開、恢復圖像,關(guān)閉、保存當前窗口圖像。系統(tǒng)對于打開文件應有兩種方式,一是在系統(tǒng)“文件”菜單欄下通過“打開”按鈕對圖像文件進行載入,二是將圖像拖入系統(tǒng)顯示窗口進行打開。
(2)基本圖像處理:在圖像處理的過程中應先對圖像進行一些基本的處理,比如灰度化圖像,紅(R)、綠(G)、藍(B)通道的提取,以及圖像二值化,其常見算法如OSTU法、百分比閾值(P-Tile)法等。
(3)形態(tài)學處理:膨脹與腐蝕是兩種最基本也是最重要的形態(tài)學運算,可以消除圖像噪聲,尋找圖像中明顯的極大極小值區(qū)域,分割獨立圖像元素,以及連接相鄰元素[9]。運用膨脹與腐蝕這兩個基本操作,可以實現(xiàn)較高級的形態(tài)學變換,如開運算、閉運算、頂帽與黑帽等。
(4)領(lǐng)域處理:圖像在采集,傳輸?shù)倪^程中不可避免地會受到外界的干擾產(chǎn)生各種噪聲和失真。為了抑制噪聲,盡量保持圖像細節(jié)特征,需要對圖像進行平滑處理[10]。邊緣檢測是領(lǐng)域處理中極為重要的一環(huán),大多數(shù)情況下在平滑處理的基礎(chǔ)上進行,其主要目的是為了標識圖像中亮度變化明顯的部分[11]。圖像處理中有多種邊緣檢測算子,如Canny算子、Sobel算子、拉普拉斯算子等。
(5)點的處理:包含幾種常用的幾何變換操作,如水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)、各種角度旋轉(zhuǎn)等。此外還包含了圖像直方圖、直方圖均衡化等基本圖像增強操作。
(6)自定義閾值化:圖像閾值化是一種最常用的圖像分割方法[12],所謂閾值化就是當圖像像素點矩陣中的每個像素點的灰度值小于自定義閾值T時為0(黑色),大于閾值T時為255(白色),使圖像轉(zhuǎn)化為二值(黑白)圖像。
(7)圖像變換:包括顏色空間變換與圖像正交變換。在圖像處理中,不同的顏色空間有著不同的特性,為了便于分析各種圖像的特性,在實際中需要對圖像進行不同顏色空間的轉(zhuǎn)換。常見的顏色空間有RGB、HSV、Lab、YCrCb等。圖像的正交變換主要是將圖像由空間域轉(zhuǎn)換到另一個域進行更方便有效的分析與處理,如傅里葉變換是將圖像轉(zhuǎn)變?yōu)轭l域信號,進而對頻譜進行分析[13]。除了傅里葉變換以外,還有小波變換、K-L變換等。
(8)其他圖像處理:包含一些特定的角點檢測算法,霍夫變換的直線與圓檢測,文字提取,亮度對比度調(diào)整等一些綜合圖像處理。
在設(shè)計界面時,系統(tǒng)界面應簡潔清晰,方便用戶使用。根據(jù)系統(tǒng)功能需求,設(shè)計相應的界面功能模塊,主要有菜單欄、圖像顯示模塊,以及其他一些功能顯示模塊。菜單欄中主要是圖像的打開、關(guān)閉與保存,以及相應的圖像處理功能菜單。圖像顯示模塊是顯示打開圖像,以及顯示處理完成后的圖像。其他顯示模塊,可以設(shè)計為顯示圖像文件的直方圖,以及圖像的傅里葉變換等,方便用戶對圖像進行研究。在設(shè)計系統(tǒng)界面的過程中應遵循以下幾點:
(1)菜單欄應和功能設(shè)計保持一致,菜單名稱與相應圖像處理功能要一一對應,不能出現(xiàn)菜單名稱與處理功能不匹配的現(xiàn)象。
(2)在菜單層次設(shè)計中,子菜單劃分應與上一層菜單呈包含關(guān)系,方便用戶能快速找到相應的圖像處理功能。
(3)各顯示模塊都能準確顯示。
文中的圖像處理系統(tǒng)是在Windows7平臺下進行開發(fā),采用的開發(fā)環(huán)境為Qt Creator。Qt Creator是一款功能十分強大的集成開發(fā)環(huán)境,主要包含項目模板生成、代碼編輯、UI設(shè)計、QML界面編輯等豐富功能[8]。Qt Creator采用C++面向?qū)ο笤O(shè)計,具有跨平臺、界面設(shè)計美觀等特點,因此得到了廣泛的應用。
在系統(tǒng)實現(xiàn)的過程中,首先在Qt Creator集成開發(fā)環(huán)境中新建Qt Widgets Application窗體項目,該項目中包含了一個基于Qt設(shè)計師的主窗體,因此可以用于開發(fā)傳統(tǒng)基于部件的窗體界面程序。
在窗體項目創(chuàng)建的過程中,在類信息設(shè)置界面,有三個最為關(guān)鍵的基類選擇,分別是QMainWindow、QWidget、QDialog。
QMainWindow類:基于主窗口類的程序,一般用于較為復雜的應用程序。它提供了一個有菜單欄、工具欄、狀態(tài)欄以及多個可??康墓ぞ邔υ捒虻闹鲬贸绦虼翱?。
QWidget類:最簡單最基本的窗體程序,里面可以放置多個控件實現(xiàn)程序功能[14]。
QDialog類:是對話框窗口的基類,一般用于彈窗來執(zhí)行短期任務(wù),也可以用于主界面顯示,但沒有菜單欄、工具欄、狀態(tài)欄等。
基于以上敘述,該系統(tǒng)采用QMainWindow類來實現(xiàn)主體界面的實現(xiàn),打開項目中ui文件,Qt Creator會自動進入設(shè)計模式,可以對圖像界面進行可視化編輯。經(jīng)過對系統(tǒng)功能分析,以及界面設(shè)計需求,系統(tǒng)界面如圖1所示。
圖1 系統(tǒng)界面
從外部文件載入圖像,圖像處理完成后結(jié)果的顯示以及存儲,要用到OpenCV2中的imread、imshow、imwrite函數(shù)[4]。imread函數(shù)用于讀取一幅圖像,并將其轉(zhuǎn)換成一個Mat對象,它有兩個參數(shù),其函數(shù)原型為:
Matimread(const string& filename, //要加載的圖像,一般使用絕對路徑
int flags=1//指定加載圖像顏色類型,flags>0 三通道彩色圖像
//flags=0灰度圖像
//flags<0包含Alpha通道加載的圖像
);
函數(shù)imshow是在特定窗口上顯示圖像,其函數(shù)原型為
voidimshow(const string& winname, //窗口名稱
InputArray image //要顯示的圖像
);
函數(shù)imwrite是將圖像保存到指定目錄路徑,其函數(shù)原型為
bool imwrite(const string& filename, //寫入要保存圖像文件名
InputArray img, //保存的圖像,類型為Mat
const std::vector
);
該圖像處理系統(tǒng)打開圖像如圖2所示。
圖2 圖像系統(tǒng)展示
在圖像處理的過程中,根據(jù)對圖像處理目的的不同,一般先對圖像進行預處理(平滑、灰度化、二值化),然后運用各種圖像處理算法,比如形態(tài)學處理、邊緣檢測、幾何變換等。由于圖像處理算法過多,下面僅以大律法(OSTU)二值化為例,并在系統(tǒng)中顯示圖像處理后的結(jié)果,如圖3所示。
Matmy_class::Get_OSTUThresholdIMG(Mat SrcImg3C)//大津法二值化
{
MatSrcGray;
cv::cvtColor(SrcImg3C,SrcGray,CV_BGR2GRAY);
doubleThre_value;
int *HistGram=new int[256];
IplImage SrcGray_1=IplImage(SrcGray);
GetHistGram(&SrcGray_1,HistGram); //獲取直方圖
Thre_value=GetOSTUThreshold(HistGram); //大津法
MatthreIMG;
threshold(SrcGray, threIMG, Thre_value,255,0); //圖像二值化
SrcGray.release();
Mat ReturnIMG3C;
if(threIMG.channels()==1)
{
cvtColor(threIMG,ReturnIMG3C,CV_GRAY2BGR);
}
else
ReturnIMG3C=threIMG;
threIMG.release();
return ReturnIMG3C;
}
圖3 大律法二值化結(jié)果
在3.1節(jié)與3.2節(jié)中,系統(tǒng)總體設(shè)計都已實現(xiàn),而系統(tǒng)測試與驗證是系統(tǒng)開發(fā)過程中的最后階段,它是檢驗一個系統(tǒng)是否滿足預期設(shè)計的必要手段。本節(jié)主要從界面交互性、功能模塊穩(wěn)定性、顯示模塊準確性、擴展性四個方面對該系統(tǒng)進行測試與驗證。
(1)界面交互性。
從上兩節(jié)可以看出該系統(tǒng)界面簡潔清晰,布局合理。打開菜單欄,菜單欄與子菜單欄按鈕名稱準確,顯示規(guī)范,層次分明,方便用戶操作,有較好的交互性,符合界面設(shè)計要求。
(2)功能模塊穩(wěn)定性。
在處理圖形的過程中,系統(tǒng)各個處理功能均能正常運行且運行穩(wěn)定,反應迅速,沒有出現(xiàn)程序意外關(guān)閉,崩潰等情況,有效提高了工作效率。由于圖像處理功能較多,下面列出了部分功能測試結(jié)果以及部分效果圖,如圖4所示。
形態(tài)學處理:膨脹、腐蝕、開閉運算、頂帽、黑帽圖像處理結(jié)果顯示準確,達到設(shè)計要求。
幾何變換:圖像在系統(tǒng)中能夠翻轉(zhuǎn),多角度旋轉(zhuǎn)與設(shè)計要求一致。
邊緣檢測:系統(tǒng)中三種邊緣檢測算法,Sobel、Canny、Laplacian算子均能準確實現(xiàn),符合預期設(shè)計。
(3)顯示模塊準確性。
經(jīng)測試,系統(tǒng)圖像顯示模塊均能準確顯示與處理功能相匹配的圖像,圖像直方圖與傅里葉變換圖也能準確顯示。
(4)擴展性。
在系統(tǒng)測試階段,為檢驗系統(tǒng)是否具有良好的擴展性,在系統(tǒng)中增添了油畫效果。如圖4(d)所示,該功能能正常工作,系統(tǒng)具有良好的擴展性。
圖4 測試效果
采用OpenCV研究開發(fā)的圖像處理系統(tǒng),實現(xiàn)了許多圖像處理方面的通用算法,可以滿足對圖像的大多數(shù)處理需求[15-16]。由于OpenCV具有非常高的通用性,并在Qt Creator下實現(xiàn)系統(tǒng)的設(shè)計與開發(fā),因此該系統(tǒng)具有較好的可擴展性與可移植性。經(jīng)測試驗證,該系統(tǒng)操作簡單,界面友好,能根據(jù)不同需求有效地處理不同格式的圖像,提高了工作效率。