楊云源,陳 瑞
(1.楚雄師范學(xué)院 資源環(huán)境與化學(xué)學(xué)院,云南 楚雄 675000;2.楚雄師范學(xué)院 管理與經(jīng)濟(jì)學(xué)院,云南 楚雄 675000)
高分辨率遙感圖像主要源自星載高分遙感和機(jī)載低空航測(cè)。高分辨率遙感數(shù)據(jù)實(shí)時(shí)處理與提升運(yùn)算速度是海量高分遙感圖像處理需面對(duì)的問題。計(jì)算機(jī)集群運(yùn)算、CPU多核運(yùn)算、CPU+GPU協(xié)同運(yùn)算[1]、遙感云計(jì)算是常見的遙感圖像加速處理方法。計(jì)算機(jī)集群運(yùn)算需要大量的硬件投入;CPU多核運(yùn)算、CPU+GPU協(xié)同運(yùn)算充分發(fā)揮了本機(jī)硬件功能;云計(jì)算高度依賴云端軟硬件部署與網(wǎng)絡(luò)。如遙感云計(jì)算平臺(tái)Google Earth Engine,針對(duì)的是免費(fèi)中低分辨率遙感數(shù)據(jù)?,F(xiàn)有諸多研究將高分辨率遙感圖像預(yù)處理、圖像增強(qiáng)、圖像分類等算法移植到了GPU上,獲得了較高加速比[2]。SIFT (scale-invariant feature transform)算法進(jìn)行特征點(diǎn)識(shí)別,具有旋轉(zhuǎn)不變性與尺度不變性、特征點(diǎn)識(shí)別精度高等特點(diǎn)。SIFT具有旋轉(zhuǎn)、尺度、亮度不變性等諸多優(yōu)點(diǎn),被廣泛運(yùn)用在圖像校正、變換、拼接、匹配、融合[3-4]等領(lǐng)域。在此基礎(chǔ)上,還演化出了SURF(speed up robust feature)算法[5]、ORB(oRiented brief)算法[6]等。
SIFT算法與高分辨率遙感結(jié)合,主要圍繞3方面:①CUDA支持的SIFT并行運(yùn)算實(shí)現(xiàn)遙感圖像運(yùn)算加速[7]。郝昀超等[8]將SIFT算法的高斯金字塔建立、局部極值探測(cè)進(jìn)行GPU并行計(jì)算,獲得約3倍的加速比。肖漢等[9]將SIFT特征匹配的高斯金字塔構(gòu)建、關(guān)鍵點(diǎn)精確定位、關(guān)鍵點(diǎn)主方向提取、特征匹配放在GPU中計(jì)算。汪亮等[10]提出CoSIFT算法,利用CUDA高速存儲(chǔ)器提升數(shù)據(jù)訪問速度和二維高斯卷積核降維的方法提升SIFT計(jì)算性能。②對(duì)SIFT算法優(yōu)化實(shí)現(xiàn)運(yùn)算加速。如王曉紅等[11]在無人機(jī)影像匹配中,采用AKAZE算法檢測(cè)影像的特征點(diǎn),再用SIFT描述符描述特征向量并計(jì)算特征點(diǎn)的主方向。張海濤等[12]利用Marr小波進(jìn)行圖像特征提取,然后基于歐氏距離進(jìn)行特征點(diǎn)初配準(zhǔn),提升配準(zhǔn)精度和效率。鄭茜穎等[13]使用主成分分析對(duì)64維SIFT特征描述符降維來實(shí)現(xiàn)圖像快速拼接,獲取了1.6~2.2倍的加速。張勇等[14]使用雙向2DPCA對(duì)SIFT特征描述符降維的方法實(shí)現(xiàn)圖像拼接。楊佳賓等[15]利用無人機(jī)航測(cè)POS數(shù)據(jù)輔助Dense SIFT算法獲取初始匹配點(diǎn),獲取匹配點(diǎn)數(shù)量是傳統(tǒng)SIFT算法5倍多。③降低參與SIFT運(yùn)算數(shù)據(jù)量實(shí)現(xiàn)運(yùn)算加速。如高陽等[16]通過提取關(guān)鍵特征點(diǎn)并進(jìn)行匹配來降低計(jì)算數(shù)據(jù)量,從而加速了圖像配準(zhǔn)。研究中,文獻(xiàn)[7]~[10]將關(guān)鍵步驟全部或部分地移植在GPU上并行計(jì)算。文獻(xiàn)[11]~[12]對(duì)最復(fù)雜的特征點(diǎn)部分提取進(jìn)行優(yōu)化,文獻(xiàn)[13]~[14]對(duì)特征描述符降維實(shí)現(xiàn)圖像拼接,文獻(xiàn)[15]使用了機(jī)載POS數(shù)據(jù)輔助SIFT運(yùn)算實(shí)現(xiàn)優(yōu)化加速,文獻(xiàn)[16]通過減少運(yùn)算量實(shí)現(xiàn)優(yōu)化加速。高分辨率影像SIFT計(jì)算的特征點(diǎn)密集、特征點(diǎn)提取算法復(fù)雜度高、需逐點(diǎn)運(yùn)算,計(jì)算時(shí)間長(zhǎng)。隨著傳感器技術(shù)進(jìn)步,遙感影像的4個(gè)分辨率進(jìn)一步提高,高分辨率遙感圖像,尤其是無人機(jī)低空獲取高重疊度多視影像,數(shù)據(jù)量更大,導(dǎo)致高分遙感影像數(shù)據(jù)量激增。高分辨率圖像實(shí)時(shí)處理對(duì)基于特征點(diǎn)的圖像運(yùn)算提出更快速處理要求。基于SIFT的圖像拼接算法自身有一定的優(yōu)化提升空間[7-8]。SIFT運(yùn)算中,通過減少參與計(jì)算的數(shù)據(jù)量與算法優(yōu)化等方式,實(shí)現(xiàn)圖像快速拼接值得深入探索。
本文使用Python+OpenCV對(duì)WorldView3高分辨率遙感切片數(shù)據(jù)進(jìn)行快速拼接實(shí)驗(yàn),本研究探討通過減少參與SIFT計(jì)算的數(shù)據(jù)量及優(yōu)化算法來實(shí)現(xiàn)圖像快速拼接的可行性,優(yōu)選出圖像快速拼接算法;進(jìn)一步使用CUDA并行計(jì)算檢驗(yàn)算法提升空間。
圖1 基于ED-SIFT的圖像拼接算法流程
建立的算法基于ED-SIFT(Edge Detection & SIFT)的圖像拼接算法?;赟IFT的圖像拼接,圖像順序進(jìn)行特征檢測(cè)、特征匹配(BFMatch)、最優(yōu)特征點(diǎn)獲取、最優(yōu)特征點(diǎn)對(duì)坐標(biāo)獲取、單應(yīng)矩陣計(jì)算、圖像變換、圖像縫合即完成圖像拼接。由于SIFT特征點(diǎn)提取算法復(fù)雜度高,需逐點(diǎn)運(yùn)算,設(shè)法降低運(yùn)算數(shù)據(jù)量是提速的關(guān)鍵?;贓D-SIFT的圖像拼接,圖像經(jīng)邊緣檢測(cè)后再執(zhí)行SIFT特征檢測(cè);最后進(jìn)行最優(yōu)特征點(diǎn)對(duì)坐標(biāo)獲取優(yōu)化與圖像縫合優(yōu)化。基于ED-SIFT的圖像拼接算法流程(見圖1)中,算法設(shè)計(jì)更改的部分如圖1中黑色區(qū)域所示。具體流程如下:
1)邊緣檢測(cè)算法擇優(yōu)。研究通過邊緣檢測(cè)減少參與SIFT計(jì)算的數(shù)據(jù)量,從而減少參與BFMatch特征匹配的特征點(diǎn)數(shù)量,實(shí)現(xiàn)圖像快速拼接。邊緣檢測(cè)算法主要有Sobel邊緣檢測(cè)、Laplacian邊緣檢測(cè)、MorphologyEx形態(tài)學(xué)變換、Canny邊緣檢測(cè)、Scharr濾波器。研究從以上邊緣檢測(cè)算法中優(yōu)選速度最快的算法。
2)最優(yōu)特征點(diǎn)對(duì)坐標(biāo)獲取優(yōu)化。優(yōu)化計(jì)算代碼,直接根據(jù)圖像的BFMatch匹配結(jié)果和SIFT計(jì)算的特征點(diǎn)數(shù)據(jù)映射出特征點(diǎn)坐標(biāo)對(duì)。算法不再生成并存儲(chǔ)最優(yōu)點(diǎn)對(duì)信息。整個(gè)優(yōu)化過程將3個(gè)循環(huán)和2個(gè)條件判斷歸并為1個(gè)循環(huán)和1個(gè)條件判斷,無中間變量生成與存儲(chǔ)。
3)圖像縫合。采用全圖整體拷貝,檢測(cè)圖像第一通道空值區(qū)后,完成拼接圖像裁剪得到結(jié)果。
2.1 實(shí)驗(yàn)數(shù)據(jù)與實(shí)驗(yàn)平臺(tái)
Anaconda是包含180多個(gè)科學(xué)包及其依賴項(xiàng)的開源的Python平臺(tái)。通過Anaconda下Jupyter Notebook在瀏覽器中實(shí)現(xiàn)基于Python的集成開發(fā)。圖2是Jupyter Notebook的GIS-RS編程擴(kuò)展。CUDA是NVIDIA公司基于GPU的通用計(jì)算體系。CUDA運(yùn)算中,32個(gè)Thread(1個(gè)Warp)組成運(yùn)行和調(diào)度的基本單元。通過對(duì)GPU數(shù)據(jù)組織、存儲(chǔ)器訪問控制、線程劃分等可實(shí)現(xiàn)程序的粗粒度與細(xì)粒度并行。Python下遙感圖像運(yùn)算的CUDA并行開發(fā)可使用Numba(通過及時(shí)編譯機(jī)制優(yōu)化Python代碼)或PyCUDA(按照C/C++語法調(diào)用CUDA內(nèi)核函數(shù))實(shí)現(xiàn)。本研究使用的OpenCV、圖像CUDA并行運(yùn)算的Numba都集成在Anaconda3里。
使用從北京攬宇方圓信息技術(shù)有限公司購買的2018-01-24楚雄市區(qū)WorldView3全色和多光譜Pansharping融合數(shù)據(jù)。分別截取3組重疊率為20%、65%、80%的切片數(shù)據(jù),每組為1 210像素×630像素的兩幅彩色圖片,共6張。計(jì)算機(jī)配置為Intel Core i7 6700 3.4GHz、內(nèi)存DDR4 8G、顯卡GTX970(1664 CUDA Core)。
圖2 Jupyter Notebook的GIS-RS編程擴(kuò)展
本研究使用方法包括:①基于ED-SIFT算法的圖像拼接。待拼接圖像先執(zhí)行高效率邊緣檢測(cè),減少參與SIFT計(jì)算的數(shù)據(jù)量;優(yōu)選能使圖像拼接加速的邊緣檢測(cè)算法;進(jìn)行圖像拼接的最優(yōu)特征點(diǎn)坐標(biāo)對(duì)計(jì)算代碼優(yōu)化、圖像縫合代碼優(yōu)化。②對(duì)以上圖像拼接方法的Numba加速實(shí)驗(yàn)。
實(shí)現(xiàn)方法為:①ED-SIFT算法實(shí)現(xiàn)。將本算法封裝為5個(gè)函數(shù)(邊緣檢測(cè)-SIFT-特征匹配、最優(yōu)特征點(diǎn)坐標(biāo)對(duì)獲取、后續(xù)計(jì)算),統(tǒng)計(jì)總耗時(shí)。為代碼添加@auto.jit修飾器,再次統(tǒng)計(jì)總耗時(shí)。②ED-SIFT算法的最優(yōu)特征點(diǎn)坐標(biāo)對(duì)獲取代碼CUDA并行。使用cuda.jit修飾器,修改Numba不能識(shí)別的最優(yōu)特征點(diǎn)坐標(biāo)對(duì)獲取代碼,將參數(shù)轉(zhuǎn)換為Numba支持的基本數(shù)據(jù)類型,進(jìn)行多線程運(yùn)算設(shè)計(jì),最終實(shí)現(xiàn)基于CUDA的多線程并行。此程序中計(jì)算總耗時(shí)采用循環(huán)100次的平均耗時(shí)。
基于ED-SIFT的圖像拼接算法實(shí)現(xiàn)中,完成5種圖像邊緣檢測(cè)、最優(yōu)特征點(diǎn)坐標(biāo)對(duì)直接映射、圖像縫合時(shí)整圖拷貝。以Soble運(yùn)算為例,執(zhí)行運(yùn)算后,圖像數(shù)據(jù)量明顯減少。圖3是待拼接圖像及其Sobel運(yùn)算后的直方圖對(duì)比。
本研究共組合出7種計(jì)算方法,對(duì)比7種方法的計(jì)算效率(待拼接圖像重疊率為65%)。圖4是基于SIFT圖像拼接和基于ED-SIFT的圖像拼接的特征點(diǎn)及最優(yōu)匹配點(diǎn)對(duì)比。表1是7種圖像拼接方法的特征點(diǎn)和速度對(duì)比。
圖3 待拼接圖像及其Sobel運(yùn)算后的對(duì)比
特征點(diǎn)數(shù)量對(duì)比:表1中方法1~2不進(jìn)行邊緣檢測(cè),未改變參與運(yùn)算的數(shù)據(jù)量,SIFT計(jì)算特征點(diǎn)數(shù)量相同。局部特征基本條件是需要一定數(shù)目的特征點(diǎn)[19]。采用5種邊緣檢測(cè),除 Scharr運(yùn)算外,再進(jìn)行SIFT運(yùn)算得到的特征點(diǎn)數(shù)目都變少,其中Canny運(yùn)算特征點(diǎn)急劇減少,不宜采用?;贓D-SIFT圖像拼接優(yōu)選的邊緣檢測(cè)采用Sobel運(yùn)算。兩個(gè)待拼接圖像執(zhí)行基于ED-SIFT的圖像拼接,特征點(diǎn)合計(jì)從28 339個(gè)減少至10 117個(gè),減少64.3%;匹配點(diǎn)對(duì)從14 229個(gè)減少至5 324個(gè),減少62.6%;最優(yōu)點(diǎn)對(duì)數(shù)從5 933個(gè)減少至754個(gè),減少87.3%。ED-SIFT算法特征點(diǎn)總數(shù)減少,但仍能保持一定數(shù)目的特征點(diǎn)。
圖4 基于SIFT圖像拼接和基于ED-SIFT圖像拼接的特征點(diǎn)及最優(yōu)匹配點(diǎn)對(duì)比
計(jì)算耗時(shí)對(duì)比,
S=(T2-T1)/T1.
(1)
式中:S為加速倍率,T2為基于SIFT的圖像拼接方法耗時(shí),T1為其余某一種算法耗時(shí)。基于SIFT的圖像拼接平均耗時(shí)10.05 s,圖像縫合使用整圖拷貝后提速明顯;5種圖像邊緣檢測(cè)算法參與后,雖然過程變長(zhǎng),但除Scharr運(yùn)算對(duì)圖像拼接起阻礙作用外,其余4種邊緣檢測(cè)對(duì)圖像拼接起到促進(jìn)作用,且Sobel算法加速效果最好。本研究確定的基于ED-SIFT的圖像拼接算法(表1中方法3)選定的Sobel運(yùn)算在減少特征點(diǎn)數(shù)量和加快圖像拼接速度兩方面皆占優(yōu)勢(shì)?;赟IFT的圖像拼接方法平均耗時(shí)10.05 s,基于ED-SIFT的圖像拼接算法平均耗時(shí)為0.96 s,加速倍率(S)為9.47,即速度加快9.47倍。
不同重疊率圖像拼接對(duì)比:使用重疊率分別為20%、65%、80%、100%的圖片組進(jìn)行實(shí)驗(yàn)。表2是基于ED-SIFT的圖像拼接算法對(duì)不同重疊率圖片拼接實(shí)驗(yàn)結(jié)果。本研究建立的基于ED-SIFT的圖像拼接算法對(duì)4種重疊率的圖像拼接平均耗時(shí)都在0.96~1.08 s,圖像成功拼接。圖像拼接中計(jì)算產(chǎn)生的最優(yōu)特征點(diǎn)數(shù)目變化較大,但是耗時(shí)差異不明顯。說明基于邊緣檢測(cè)+SIFT運(yùn)算的圖像拼接方法切實(shí)可行。
表1 7種圖像拼接方法的特征點(diǎn)和速度對(duì)比(重疊率:65%)
表2 基于ED-SIFT的圖像拼接算法對(duì)不同重疊率圖片拼接實(shí)驗(yàn)結(jié)果
搭配使用CUDA的@auto.jit修飾器、@cuda.jit修飾器進(jìn)行加速運(yùn)算,兩種方法整體速度都變慢。OpenCV下,邊緣檢測(cè)、SIFT運(yùn)算、BFmatch圖像匹配、單應(yīng)矩陣運(yùn)算、圖像變換都各自集合為函數(shù),@auto.jit修飾器對(duì)其無益。對(duì)最優(yōu)點(diǎn)的坐標(biāo)對(duì)獲取使用@cuda.jit修飾器并行加速。然而Numba支持Numpy等基本的數(shù)據(jù)類型,但不支持SIFT運(yùn)算產(chǎn)生的CV2.KeyPoint類和BFmatch特征點(diǎn)匹配產(chǎn)生的CV2.DMath類。必須把計(jì)算中使用的distance值等數(shù)據(jù)提取出來才能加載到CUDA運(yùn)算。最優(yōu)點(diǎn)對(duì)的坐標(biāo)獲取優(yōu)化本身耗時(shí)不多,@cuda.jit運(yùn)算需涉及數(shù)據(jù)類型轉(zhuǎn)換、數(shù)據(jù)拷貝、程序調(diào)度、程序啟動(dòng)等操作,需一定的時(shí)間,這些原因?qū)е翤cuda.jit 修飾器計(jì)算速度變慢。OpenCV函數(shù)高度集成,OpenCV+Numba環(huán)境下加速,Numba支持的功能和支持的數(shù)據(jù)類型有限,對(duì)基于ED-SIFT的圖像拼接提速已不明顯。OpenCV下的算法加速還是需以減少數(shù)據(jù)量和代碼優(yōu)化為主。
建立基于ED-SIFT的圖像拼接算法,通過Sobel邊緣檢測(cè)減少參與SIFT計(jì)算的數(shù)據(jù)量和優(yōu)化計(jì)算代碼的方法實(shí)現(xiàn)圖像拼接加速。在計(jì)算機(jī)上,以Pyhon+OpenCV為平臺(tái),對(duì)1 210像素×630像素的WorldView3切片數(shù)據(jù)進(jìn)行拼接實(shí)驗(yàn),平均耗時(shí)為0.96 s,與傳統(tǒng)基于SIFT的圖像拼接算法相比,在保證一定數(shù)目的特征點(diǎn)的同時(shí),速度加快9.47倍。使用該算法對(duì)重疊率為20%、65%、80%的切片數(shù)據(jù)進(jìn)行拼接,都能成功拼接,耗時(shí)在0.96~1.08 s。繼續(xù)進(jìn)行OpenCV+Numba下基于ED-SIFT的圖像拼接,提速不明顯。
基于ED-SIFT的圖像拼接算法進(jìn)行高分辨率遙感圖像快速拼接取得較好效果。以Pyhon+OpenCV為平臺(tái)的RS-GIS數(shù)據(jù)處理,一定程度上降低了開發(fā)難度。對(duì)基于特征點(diǎn)提取為基礎(chǔ)的圖像快速拼接、基于CUDA的圖像拼接并行計(jì)算等相關(guān)研究有待同仁繼續(xù)努力。