楊 昊
(西安電子科技大學(xué)電子工程學(xué)院,陜西西安 710071)
邊緣檢測(cè)經(jīng)常被用作一種模式識(shí)別算法的工具,同時(shí)也是預(yù)測(cè)圖像壓縮算法中必不可少的部分,當(dāng)只使用一種方法時(shí),若無驗(yàn)證,邊緣的預(yù)測(cè)誤差較大,這使存檔壓縮比率大幅減少。
由于邊緣檢測(cè)的重要性,有眾多算法已開發(fā)來解決這一問題。例如,Marr-Hildreth[1]邊緣檢測(cè)是使用高斯函數(shù)作為平滑函數(shù),使用拉普拉斯算子提取圖像二階倒數(shù)的“零交叉”來進(jìn)行的邊緣檢測(cè)。Sobol,Roberts,Cross 和 Prewitt[2]通過梯度算子估計(jì)圖像灰度變化的方向,增強(qiáng)圖像變化中的灰度變化區(qū)域,對(duì)增強(qiáng)的區(qū)域進(jìn)一步判斷邊緣。Canny邊緣檢測(cè)算子認(rèn)為,邊緣檢測(cè)的算子應(yīng)滿足最優(yōu)準(zhǔn)則、信噪比準(zhǔn)則、定位精度準(zhǔn)則及單邊緣響應(yīng)準(zhǔn)則。這些算子從某種程度上均是將圖像的變化看作是梯度,將較大的變化認(rèn)作邊界。
CUDA 邊緣檢測(cè)最初用于 Sobol、Canny算子[5]以及Gabor[6]小波算子的并行運(yùn)算。文中將詳細(xì)介紹基于局部閾值和布爾函數(shù)的并行運(yùn)算。將介紹局部閾值和二值函數(shù)的算法。并給出了并行化并用CUDA的實(shí)現(xiàn)。
基于局部閾值和二值函數(shù)[3]下的邊緣檢測(cè)在概念上與上述邊緣檢測(cè)完全不同,若是將3×3的圖像通過局部閾值函數(shù)轉(zhuǎn)換到位塊中,而位塊中出現(xiàn)的一些模式則被定義為邊緣檢測(cè)的算子。
這些算法的共同特性是在圖像的每個(gè)像素點(diǎn)均存在大量的數(shù)據(jù)計(jì)算,同時(shí)這些數(shù)據(jù)的計(jì)算也都是獨(dú)立進(jìn)行。由于這種性質(zhì),獨(dú)立像素的運(yùn)算符合并行運(yùn)行的理想條件。近年來,隨著GPU編程的發(fā)展,海量數(shù)據(jù)的并行運(yùn)算越發(fā)普及與流行,GPU編程已演化為高度并行、多線程、多核處理的高速大數(shù)據(jù)計(jì)算能力,并具有較高的存儲(chǔ)器帶寬。同時(shí),在 CUDA[4]、OpenCL、Microsoft DirectCompute等軟件開發(fā),GPU運(yùn)算已變得愈發(fā)成熟。
基于局部閾值和二值函數(shù)的邊緣檢測(cè)無需依賴于梯度的變化,該方法以局部閾值為基礎(chǔ)將局部像素點(diǎn)轉(zhuǎn)換為二進(jìn)制模式,并利用掩碼來確定在某一確定點(diǎn)上是否存在邊界。當(dāng)獲得的二進(jìn)制模型符合邊界模型時(shí),便可獲得更多精確的像素點(diǎn)。閾值計(jì)算是基于點(diǎn)的計(jì)算,所以該方法中的一個(gè)優(yōu)勢(shì)就是無需任何一種平滑函數(shù)來減少圖像噪聲。
步驟1 運(yùn)用局部閾值將3×3視窗的圖像像素點(diǎn)轉(zhuǎn)變?yōu)橐粋€(gè)位塊模式。局部閾值的數(shù)值在圖像的每個(gè)像素點(diǎn)上進(jìn)行再運(yùn)算,減去小的誤差來得到九格窗口的平均像素強(qiáng)度。轉(zhuǎn)換3×3的窗口按照以下方法:如果像素點(diǎn)的強(qiáng)度大于它的閾值,則賦予二進(jìn)制的值為1,反之為0。接下來通過進(jìn)一步分析來給出3×3的模塊。
步驟2 對(duì)于每個(gè)像素點(diǎn),文中將符合邊緣模式壓縮成3×3的二進(jìn)制模塊。對(duì)于3×3的二進(jìn)制矩陣來說,存在16種可能的邊緣圖像,如圖1所示。若二進(jìn)制窗口得到的1的數(shù)值和16個(gè)矩陣中的任意一個(gè)相等,則窗口中的中間像素便可被認(rèn)作為邊緣像素。
圖1 3×3的二進(jìn)制模塊中的中心像素被認(rèn)作邊緣像素點(diǎn)
步驟3 對(duì)圖像中每個(gè)中心窗口像素重復(fù)進(jìn)行步驟1和步驟2。這樣可獲得所有符合要求的邊緣像素。此步驟依舊會(huì)存在一些由于噪聲所引起的錯(cuò)誤邊緣。
步驟4 用全局閾值來消除錯(cuò)誤邊緣。每個(gè)3×3矩陣的計(jì)算誤差,在邊緣會(huì)得到一個(gè)最大值,用此數(shù)值與全局閾值進(jìn)行對(duì)比,而全距閾值則通過圖像的屬性,如噪聲強(qiáng)度來確定。那些被期望成為邊緣的像素點(diǎn)值大于全局閾值,則這些像素點(diǎn)依舊是符合條件的邊緣點(diǎn)。反之,則刪除這些不符合的像素點(diǎn)。
二值法的邊緣檢測(cè)算子與Canny算子非常相似,即使兩種算法使用完全不同的兩種算子。二值法檢測(cè)中的邊緣通常是多斑點(diǎn)的,通過分析顯示,對(duì)于邊緣鋒利的圖像,二值邊緣檢測(cè)明顯優(yōu)于Canny邊緣檢測(cè)。
算子的計(jì)算建立在每個(gè)獨(dú)立的像素上,且與高度不相關(guān),這適用于并行運(yùn)算的條件。CUDA通過內(nèi)核函數(shù)和多線程來實(shí)現(xiàn)并行運(yùn)算,因此這種特性是該類算法的理想模型,由于GPU和CPU在構(gòu)建上不同,GPU的處理單元擁有更小更快的存儲(chǔ)器,因此在數(shù)據(jù)的計(jì)算上GPU具有更大的優(yōu)勢(shì)。該處理方式符合邊緣檢測(cè)的算子,下面將給出如何使用CUDA來實(shí)現(xiàn)該算子。
并行算子最佳的方法就是對(duì)每個(gè)圖像像素點(diǎn)創(chuàng)造獨(dú)立的線程,執(zhí)行必要的計(jì)算并儲(chǔ)存邊緣存在的信息??煞譃樗拗骱瘮?shù)與內(nèi)核函數(shù)兩部分:宿主函數(shù)控制起始信道并使CPU獨(dú)立內(nèi)存中的輸入輸出數(shù)據(jù)成為有效的GPU設(shè)備;內(nèi)核函數(shù)負(fù)責(zé)計(jì)算、內(nèi)存管理和線程同步。宿主函數(shù)的實(shí)行分以下幾步:(1)加載輸入圖像到宿主內(nèi)存。(2)分配輸入圖像到內(nèi)存設(shè)備。(3)將輸入圖像從主機(jī)復(fù)制到存儲(chǔ)器。(4)啟動(dòng)內(nèi)核。(5)將輸出圖像從存儲(chǔ)器復(fù)制到主機(jī)。(6)自由分配宿主與設(shè)備內(nèi)存。
CUDA中眾多獨(dú)立的線程可以執(zhí)行并行化,這些線程組被組織在塊中,全部且被組織進(jìn)一個(gè)網(wǎng)格。這樣做是為了使計(jì)算更加有效,從某種意義上講,是更有效地使用可用內(nèi)存。CUDA中局部存儲(chǔ)器致力于獨(dú)立線程,共享內(nèi)存便是利用塊中的線程,全局內(nèi)存可用于所有線程。共享內(nèi)存預(yù)測(cè)會(huì)遠(yuǎn)快于全局內(nèi)存,這是因?yàn)閮?nèi)核函數(shù)可以顯著地改善性能,大量信道所需的數(shù)據(jù)會(huì)從共享和局部存儲(chǔ)器中存取。
為了方便起見,所有信道在CUDA中有一個(gè)三維的向量信道ID,這使每個(gè)獨(dú)立信道在一個(gè)一維、二維或三維的塊中識(shí)別。同樣,每個(gè)塊ID也在網(wǎng)格中識(shí)別。這便使圖像處理如邊緣檢測(cè)的執(zhí)行變得容易,文中將一個(gè)像素點(diǎn)(X,Y)連接于圖像并利用以下的方法
局部閾值和二值函數(shù)下的邊緣檢測(cè),每個(gè)信道需獲取相應(yīng)圖像像素和其相鄰所有像素點(diǎn)的值。如前所述,共享內(nèi)存會(huì)遠(yuǎn)快速于全局內(nèi)存。因此,內(nèi)核函數(shù)需從局部存儲(chǔ)器中獲取可用的像素值。如圖2(a)為通過信道塊的圖像截面處理,圖2(b)為圖像截面被加載到塊共享存儲(chǔ)器,從圖中可以看出像素處理和數(shù)值如何儲(chǔ)存進(jìn)共享存儲(chǔ)器。
圖2 圖像截面被加載到塊共享存儲(chǔ)器
二值函數(shù)對(duì)每個(gè)像素點(diǎn)均進(jìn)行獨(dú)立的邊緣存在計(jì)算。首先將3×3的窗口轉(zhuǎn)變成一個(gè)位圖模式,位圖模式將被以整形存入9宮格的掩碼中。每個(gè)單元格在3×3的矩陣中有對(duì)應(yīng)的位置,得到的掩碼與符合16可能的邊緣模式預(yù)先定義的掩碼相比較。該方法的優(yōu)點(diǎn)是可減少每個(gè)線程所需的內(nèi)存。二值函數(shù)邊緣檢測(cè)算子利用全局閾值可實(shí)現(xiàn)減少錯(cuò)誤的邊緣。從圖3中可看到,該方法所得到的邊緣檢測(cè)效果。
圖3 在局部閾值與二值函數(shù)下進(jìn)行的邊緣檢測(cè)效果
文中將對(duì)比時(shí)序和CUDA下實(shí)現(xiàn)邊緣檢測(cè)的算法。兩種算法均使用Microsoft Visual Studio 2010在4.0版本下的CUDA平臺(tái)調(diào)試。使用Intel(R)Core(TM)i7-2630 QM CPU@2.00 GHz,4 GB of DDR3 -1333 RAM,Nvidia GTX540M 1 GB在win7操作系統(tǒng)下進(jìn)行。從128×128~2 048×2 048的每組圖片進(jìn)行了100次重復(fù)的計(jì)算,并記錄了運(yùn)算所需的時(shí)間,如表1所示。
表1 時(shí)序和CUDA下實(shí)現(xiàn)邊緣檢測(cè)算法結(jié)果分析
從計(jì)算結(jié)果可看出,GPU并行運(yùn)算的速度相比于CPU時(shí)序運(yùn)算快了10倍。在未來,伴隨著CUDA的發(fā)展,這種更快更有效的方法將能夠解決更多復(fù)雜的處理。
[1]NADERNEJAD E,SHARIFZADEH S,HASSANPOUR H.Edge detection techniques:evaluationsand comparisons[J].Applied Mathematical Sciences,2008,2(31):1507 -1520.
[2]DAVISL S.A survey of edge detection techniques[J].Computer Graphics and Image Processing,1975,4(3):248 -260.
[3]AHMAD M B,CHOI T S.Local threshold and boolean function based edge detection [J].IEEE Transactions on Consumer Electronics,1999,45(3):674 -679.
[4]Nvidia Conpration.NVIDIA CUDA Cprogramming guide version 4.0[M].MA USA:Nvidia Conpration,2011.
[5]YUANCHENG L,DURAISWAMI R.Canny edgedetection on NVIDIA CUDA[C].Tianjin:IEEE Computer Society Conference on Computer Vision and Pattern Recognition Workshops,CVPRW'08,2008:1 -8.
[6]WU Q,F(xiàn)U Z,TONG C,et al.The method of parallel Gabor wavelet transformedge detection based on CUDA[C].Mosico:2010 International Conference on Environmental Science and Information Application Technology(ESIAT),2010:537-540.