劉洪江,曹玉香,李佳,梅鋒,方愛,季維虎
(1.杭州市勘測設(shè)計研究院,浙江 杭州 310012; 2.浙江工商大學(xué)公共管理學(xué)院,浙江 杭州 310018;3.杭州市錢投集團科技與數(shù)信部,浙江 杭州 310016)
隨著無人機技術(shù)的發(fā)展,無人機遙感已在眾多行業(yè)得到廣泛應(yīng)用。在新型測繪與智慧城市建設(shè)領(lǐng)域,無人機航攝正發(fā)揮越來越重要的作用,尤其在防災(zāi)減災(zāi)、應(yīng)急救援、自然資源監(jiān)測、三維城市重建等領(lǐng)域取得重要進展。目前實際應(yīng)用中,航空正射影像的制作方式主要是借助攝影測量影像處理系統(tǒng)在數(shù)字高程模型的輔助下將航拍序列影像制作正射影像,或者利用多種軟件與地形圖輔助制作正射影像[1],制作周期長,自動化程度低,無法滿足應(yīng)急需要。
近年來,國內(nèi)外對無人機影像快速拼接技術(shù)的研究很多,但多數(shù)局限在算法本身的研究和優(yōu)化。業(yè)界也推出了很多優(yōu)秀的無人機傾斜攝影處理軟件,如Smart3D、PhotosSan、Pix4D等。這些軟件在三維建模方面性能優(yōu)異,能很好地實現(xiàn)無人機影像快速拼接??焖儆跋裆a(chǎn)制作程序繁多、流程復(fù)雜,不夠便捷,而且價格昂貴。針對影像快速拼接單一任務(wù)需求的輕量化的軟件工具并不多見,所以在快速影像生產(chǎn),尤其是應(yīng)急測繪影像生產(chǎn)中瓶頸凸顯。
單幅影像通常無法覆蓋航攝測區(qū)范圍,因此大范圍影像生產(chǎn)需要對多幅影像進行鑲嵌、拼接[6]。通過研究影像快速拼接技術(shù),可以獲得寬視域、高分辨率的圖像[2],基于OpenCV圖像處理技術(shù)及其豐富的算法,可以高效率解決無人機影像快速拼接的問題。本文在OpenCV算法庫的基礎(chǔ)上,采用Python開發(fā)語言,圍繞無人機影像的特征檢測與匹配、單應(yīng)性矩陣計算、圖像透視變換、重疊區(qū)域圖像融合等問題進行研究和試驗,實現(xiàn)了影像的快速、高效、自動化拼接。
OpenCV是基于BSD許可(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它具備輕量且高效的特點——由一系列C函數(shù)和少量C++類構(gòu)成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法[3]。OpenCV采用C語言進行優(yōu)化,而且在多核計算機上面,其運行速度會更快。近年在圖像識別、圖像分割、圖像匹配、機器視覺等領(lǐng)域取得了廣泛的應(yīng)用。
圖像拼接是將處于同一場景的多張圖像之間建立對應(yīng)關(guān)系[4],關(guān)鍵是圖像匹配。目前基于無人機獲取的圖像,拼接主要采用2種方法:一是利用無人機POS數(shù)據(jù)對影像進行拼接,由于無人機自身因素和氣流的影響,一般無法得到較為精確的飛行姿態(tài);第二種方法是采用基于圖像區(qū)域特征的匹配[5]。SIFT算法是一種典型的基于特征的圖像匹配方法,應(yīng)用領(lǐng)域很廣。SIFT算法首先通過預(yù)處理對圖像進行去噪以及修正,然后利用高斯差分函數(shù)構(gòu)造多尺度空間,在不同尺度空間影像上檢測具有方向信息的局部極值點,最后將極值點精確定位,去除不穩(wěn)定的點,根據(jù)極值點臨近像素,生成特征描述子,再進行歸一化處理[4]。由于SIFT算法能夠解決圖像平移、方向及角度改變、光照改變等問題,無人機在不同時間、不同角度拍攝兩幅或多幅含有重疊區(qū)域的圖像,依舊可以獲得較好的拼接效果[2],所以在處理無人機影像匹配中應(yīng)用較多。
OpenCV計算機視覺庫對SIFT算法有著很好的支持,尤其是到了3.0以后,OpenCV對SIFT特征提取進行了系統(tǒng)性的重構(gòu),簡化了SIFT算法功能的調(diào)用,其代碼背后的理論和代碼實現(xiàn)的技術(shù)以及各種提升速度和效率的方法對圖像處理的應(yīng)用具有很大的幫助。opencv-python3.4.2以后的版本,SIFT算法包申請了專利保護,不能正常使用,所以安裝opencv-python時要選擇3.4.2以前的版本。
無人機影像拼接的第一步就是特征點提取。OpenCV視覺庫有很多特征點的定義,比如sift、surf、harris角點、ORB等,它們各有優(yōu)勢。采用SIFT特征來實現(xiàn)圖像拼接比較常用,盡管計算量大,但其穩(wěn)定性和精確度都很好。
OpenCV Python中SIFT特征點檢測,是通過建立SIFT生成器,檢測SIFT特征點并描述算子來實現(xiàn)。
descriptor=cv2.xfeatures2d.SIFT_create()
(kps,features)=descriptor.detectAndCompute(gray,None)
獲得圖像的特征點向量集合以后,就需要對特征點進行匹配,即圖像A中的特征點,根據(jù)其歐式距離的相似度,尋找圖像B中對應(yīng)的特征點。圖像的特征點數(shù)目很多,因此SIFT算法中采用了kd-tree的數(shù)據(jù)結(jié)構(gòu),降低了時間復(fù)雜度,大大提高了特征點搜索的效率。
匹配完成后,還應(yīng)根據(jù)一定的規(guī)則(如最近歐式距離與次近歐式距離的比值)進行篩選,以選取優(yōu)秀的匹配點。
matcher=cv2.BFMatcher()
rawMatches=matcher.knnMatch(featuresA,featuresB,2)
matches=[]
for m in rawMatches:
iflen(m) == 2 and m[0].distance < m[1].distance*ratio:
matches.append((m[0].trainIdx,m[0].queryIdx))
得到了兩幅待拼接圖的匹配點集后,接下來就要進行圖像的配準(zhǔn),即將兩張圖像轉(zhuǎn)換為同一坐標(biāo)系下。這時需要使用OpenCV的findHomography函數(shù)來求單應(yīng)性變換矩陣。需要注意的是,findHomography函數(shù)所要用到的點集是float32類型的,所以需要對得到的點集再作一次處理,將其轉(zhuǎn)換為float32類型的點集。
單應(yīng)性變換矩陣的計算,需要繼續(xù)篩選可靠的匹配點,使得匹配點更為精確。當(dāng)有效數(shù)據(jù)比無效數(shù)據(jù)要少的時候,最小二乘法就失效。因此本文采用RANSAC算法,即Random Sample Consensus (隨機一致性采樣)。RANSAC算法是隨機選擇幾個點,用一個函數(shù)去擬合這幾個點,給定一個σ,統(tǒng)計出在σ范圍之內(nèi)的點的個數(shù),也就是統(tǒng)計這個擬合函數(shù)的誤差率,當(dāng)誤差率小于一定值的時候停止迭代。
ptsA=np.float32([kpsA[i] for (_,i) in matches])
ptsB=np.float32([kpsB[i] for (i,_) in matches])
(H,status)=cv2.findHomography(ptsA,ptsB,cv2.RANSAC,reprojThresh)
最后是對采用單應(yīng)性變換矩陣對右圖像進行透視變換,計算右圖像像素點在左圖像中的坐標(biāo),生成配準(zhǔn)圖像。
result=cv2.warpPerspective(imageB,H,(imageA.shape[1] + imageB.shape[1],imageA.shape[0]))
簡單的圖像拼接方法,是直接將左圖像拷貝到配準(zhǔn)圖像。但是兩幅影像的拼接會不自然,原因在于拼接圖的交界處,兩幅圖像因為光照色澤、匹配精度的原因使得過渡很不均勻,所以需要進行特定的處理。本文采用的思路是加權(quán)融合,即在圖像的重疊區(qū)域?qū)⑾袼刂蛋匆欢ǖ臋?quán)值融合成新的圖像。
result[0:imageA.shape[0],0:x]=imageA[:,:x]
rows,right_col=imageA.shape[:2]
forcol in range(x,right_col):
forrow in range(rows):
if result[row,col,0]==0 and result[row,col,0]==0 and result[row,col,0]==0:
alpha=1.0
else:
alpha=((right_col-x)-(col-x))/float(right_col-x)
result[row,col]=imageA[row,col]*alpha+result[row,col]*(1-alpha)
注:x,right_col是重疊區(qū)的左右邊界。
本文以無人機航拍的照片為例進行試驗分析。像幅為 5 472×3 648,焦距 8.8 cm,感應(yīng)器尺寸 13.2 mm,如圖1所示。
圖1 無人機航拍圖像
特征點提取中,創(chuàng)建SIFT的SIFT_create函數(shù)有一個參數(shù)nfeatures,它是確定返回特征點的個數(shù)。因為無人機航拍影像分辨率非常高,特征點數(shù)量巨大,會大大影響后續(xù)的特征點匹配效率,甚至導(dǎo)致系統(tǒng)崩潰。所以需要對返回的特征點數(shù)進行限定,經(jīng)試驗比較,nfeatures=2 500時,不會影響圖像匹配的效果。特征點匹配情況如圖2所示。
圖2 特征點匹配
根據(jù)匹配點計算出兩張圖像重疊區(qū)域的單應(yīng)性轉(zhuǎn)換矩陣,并由轉(zhuǎn)換矩陣對右圖像進行透視變換,計算出其在左圖像坐標(biāo)系中的坐標(biāo),如圖3所示。
圖3 圖像配準(zhǔn)
最后是圖像的融合。簡單的融合,把左圖像拷貝到配準(zhǔn)圖像即可,但在接縫處會出現(xiàn)明顯的色差。而且因為匹配精度的原因,會出現(xiàn)紋理錯位的情況,如圖4所示。如果采用加權(quán)融合,就能很好地避免這個問題。需要指出的是,加權(quán)融合是在重疊區(qū)域內(nèi)逐個像素進行比較和計算,對圖像拼接處理的效率會有較大影響。采用加權(quán)融合后,航片拼接的結(jié)果如圖5、圖6所示。
圖4 圖像融合
圖5 圖像加權(quán)融合
圖6 圖像拼接結(jié)果
整體測區(qū)的圖像拼接結(jié)果如圖7所示。本文研究的方法基本能滿足小區(qū)域圖像快速拼接,并快速制作整體影像成果。其優(yōu)點是便捷、輕量,能根據(jù)需求量身定制,避免購買昂貴商業(yè)軟件,缺點是不能實現(xiàn)高效率、高精度正射影像的制作。
圖7 整體測區(qū)拼接結(jié)果
本文以O(shè)penCV計算機視覺庫和SIFT算法為基礎(chǔ),采用Python開發(fā)語言,對無人機航拍影像的拼接技術(shù)進行了研究和試驗,取得了較好的結(jié)果,在實際生產(chǎn)中得到了應(yīng)用。但是本文沒有將這一拼接技術(shù)在不同測區(qū)進行試驗比較,所以在建筑物密集區(qū)域或大面積植被、水域分布的區(qū)域,拼接效果如何還需要進一步研究。另外,由于受無人機航拍時的穩(wěn)定性、飛行姿態(tài)的影響,航拍圖像會有較大的變形,而拼接影像沒有經(jīng)過地面控制和正射糾正處理,其精度怎樣也有待進一步評估。