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