计算机视觉python--全景图像拼接
1 全景圖像拼接
1.1 基本介紹
圖像拼接技術(shù)就是將數(shù)張有重疊部分的圖像(可能是不同時(shí)間、不同視角或者不同傳感器獲得的)拼成一幅無縫的全景圖或高分辨率圖像的技術(shù)。圖像拼接在醫(yī)學(xué)成像、計(jì)算機(jī)視覺、衛(wèi)星數(shù)據(jù)、軍事目標(biāo)自動識別等領(lǐng)域具有重要意義。圖像拼接的輸出是兩個(gè)輸入圖像的并集。
圖像配準(zhǔn)(image alignment)和圖像融合是圖像拼接的兩個(gè)關(guān)鍵技術(shù)。圖像配準(zhǔn)是圖像融合的基礎(chǔ),而且圖像配準(zhǔn)算法的計(jì)算量一般非常大,因此圖像拼接技術(shù)的發(fā)展很大程度上取決于圖像配準(zhǔn)技術(shù)的創(chuàng)新。早期的圖像配準(zhǔn)技術(shù)主要采用點(diǎn)匹配法,這類方法速度慢、精度低,而且常常需要人工選取初始匹配點(diǎn),無法適應(yīng)大數(shù)據(jù)量圖像的融合。圖像拼接的方法很多,不同的算法步驟會有一定差異,但大致的過程是相同的。
1.2 基本原理
全景融合的3D 幾何解釋:
– 圖像被投影到共同的拼接平面上(同一坐標(biāo)系)
– 在拼接平面上實(shí)現(xiàn)全景融合
在圖像拼接中首先利用SIFT算法提取圖像特征進(jìn)而進(jìn)行特征匹配,繼而使用RANSAC算法對特征匹配的結(jié)果進(jìn)行優(yōu)化,接著利用圖像變換結(jié)構(gòu)進(jìn)行圖像映射,最終進(jìn)行圖像融合。
在圖像拼接過程中,運(yùn)用SIFT局部描述算子檢測圖像中的關(guān)鍵點(diǎn)和特征,SIFT特征是基于物體上的一些局部外觀的興趣點(diǎn)而與影像的大小和旋轉(zhuǎn)無關(guān)。對于光線、噪聲、些微視角改變的容忍度也相當(dāng)高,所以用來檢測要拼接圖像的特征及關(guān)鍵點(diǎn)就很有優(yōu)勢。而接下來是找到重疊的圖片部分,連接所有圖片之后就可以形成一個(gè)基本的全景圖了。匹配圖片最常用的方式是采用RANSAC(RANdom SAmple Consensus, 隨機(jī)抽樣一致),用此排除掉不符合大部分幾何變換的匹配。之后利用這些匹配的點(diǎn)來估算單應(yīng)矩陣”(Homography Estimation),也就是將其中一張圖像通過關(guān)聯(lián)性和另一張匹配。
以上關(guān)于SIFT算法、RANSAC算法以及圖像變換結(jié)構(gòu)可見上一篇博客詳解(計(jì)算機(jī)視覺——SIFT特征提取與檢索)。
1.2.1 APAP算法
在圖像拼接融合的過程中,受客觀因素的影響,拼接融合后的圖像可能會存在“鬼影現(xiàn)象”以及圖像間過度不連續(xù)等問題。下圖就是圖像拼接的一種“鬼影現(xiàn)象”。解決鬼影現(xiàn)象可以采用APAP算法。
算法流程:
1 提取兩張圖片的sift特征點(diǎn)
2 對兩張圖片的特征點(diǎn)進(jìn)行匹配
3 匹配后,使用RANSAC算法進(jìn)行特征點(diǎn)對的篩選,排除錯(cuò)誤點(diǎn)。篩選后的特征點(diǎn)基本能夠一一對應(yīng)
4 使用DLT算法,將剩下的特征點(diǎn)對進(jìn)行透視變換矩陣的估計(jì)
5 由于得到的透視變換矩陣是基于全局特征點(diǎn)對進(jìn)行的,即一個(gè)剛性的單應(yīng)性矩陣完成配 準(zhǔn)。為提高配準(zhǔn)的精度,Apap將圖像切割成無數(shù)多個(gè)小方塊,對每個(gè)小方塊進(jìn)行單應(yīng)性矩陣變換,非常依賴于特征點(diǎn)對。若圖像高頻信息較少,特征點(diǎn)對過少,配準(zhǔn)將完全失效,并且對大尺度的圖像進(jìn)行配準(zhǔn),其效果也不是很好,一切都決定于特征點(diǎn)對的數(shù)量。
1.2.2 尋找最佳拼接縫(Seam Finding)
在進(jìn)行圖像拼接中針對于鬼影現(xiàn)象可以很好地解決的的算法即為Seam Finding(尋找最佳拼接縫)。該算法的效果如下圖:
可以看到Seam Finding算法可以很好地解決鬼影現(xiàn)象,算法主要原理運(yùn)用了最大流最小割的思想。圖是一個(gè)具有權(quán)值的有向結(jié)構(gòu),通常采用一些節(jié)點(diǎn),一些有向連接線表示,這些節(jié)點(diǎn)是像素值,或其他特征點(diǎn)。尋找代價(jià)最小的分割,典型算法是最小割最大流算法。最大流幾句詩將圖內(nèi)帶權(quán)值看作帶有流量值的管道,將最大量水從源點(diǎn)送到匯點(diǎn)。
如何尋找一條最佳拼接縫:將匹配點(diǎn)最為接近的點(diǎn)作為拼接縫上的點(diǎn),最終構(gòu)造出拼接縫。
1.2.3 圖像融合(multi-band bleing)
融合目的在于拼縫消除, Multi-Band能夠達(dá)到比較好的融合效果,但是效率低,采用Laplacian(拉普拉斯)金字塔,通過對相鄰兩層的高斯金字塔進(jìn)行差分,將原圖分解成不同尺度的子圖,對每一個(gè)之圖進(jìn)行加權(quán)平均,得到每一層的融合結(jié)果,最后進(jìn)行金字塔的反向重建,得到最終融合效果過程。
由下圖可知multi-band bleing的效果對于拼接之后的圖像進(jìn)行融合的效果是很好的。
思想:采用的方法是直接對帶拼接的兩個(gè)圖片進(jìn)行拉普拉斯金字塔分解,后一半對前一半進(jìn)行融合。
步驟:
(1)首先計(jì)算當(dāng)前待拼接圖像和已合成圖像的重疊部分。
(2)兩幅圖像的融合:分別構(gòu)建圖像A、B的高斯金字塔和拉普拉斯金字塔,然后進(jìn)行加權(quán)融合。
(3)對加權(quán)后的拉普拉斯金字塔進(jìn)行重構(gòu)。
1.3 基本流程
圖像拼接的基本流程如下:
1 根據(jù)給定圖像/集,實(shí)現(xiàn)特征匹配
2 通過匹配特征計(jì)算圖像之間的變換結(jié)構(gòu)
3 利用圖像變換結(jié)構(gòu),實(shí)現(xiàn)圖像映射
4 針對疊加后的圖像,采用APAP之類的算法,對齊特征點(diǎn)
5 通過圖割方法,自動選取拼接縫
6 根據(jù)multi-band bleing策略實(shí)現(xiàn)融合
1.4 代碼實(shí)現(xiàn)
# ch3_panorama_test.py from pylab import * from numpy import * from PIL import Image # If you have PCV installed, these imports should work from PCV.geometry import homography, warp from PCV.localdescriptors import sift """ This is the panorama example from section 3.3. """ # set paths to data folder featname = ['F:test4\\group1\\1\\' + str(i + 1) + '.sift' for i in range(3)] imname = ['F:test4\\group1\\1\\' + str(i + 1) + '.jpg' for i in range(3)] # extract features and match l = {} d = {} for i in range(3): sift.process_image(imname[i],featname[i])l[i],d[i] = sift.read_features_from_file(featname[i]) matches = {} for i in range(2):matches[i] = sift.match(d[i+1],d[i])print(matches) # visualize the matches (Figure 3-11 in the book) for i in range(2):im1 = array(Image.open(imname[i]))im2 = array(Image.open(imname[i+1]))figure() sift.plot_matches(im2,im1,l[i+1],l[i],matches[i],show_below=True) # function to convert the matches to hom. points def convert_points(j):ndx = matches[j].nonzero()[0]fp = homography.make_homog(l[j+1][ndx,:2].T) ndx2 = [int(matches[j][i]) for i in ndx]tp = homography.make_homog(l[j][ndx2,:2].T) # switch x and y - TODO this should move elsewherefp = vstack([fp[1],fp[0],fp[2]])tp = vstack([tp[1],tp[0],tp[2]])return fp,tp # estimate the homographies model = homography.RansacModel() fp,tp = convert_points(0) H_01 = homography.H_from_ransac(fp,tp,model)[0] #im 0 to 1 tp,fp = convert_points(1) #NB: reverse order H_21 = homography.H_from_ransac(fp,tp,model)[0] #im 2 to 1 # warp the images delta = 2000 # for padding and translation im1 = array(Image.open(imname[0]), "uint8") im2 = array(Image.open(imname[1]), "uint8") im_01 = warp.panorama(H_01,im1,im2,delta,delta) im1 = array(Image.open(imname[2]), "f") im_21 = warp.panorama(H_21,im1,im_01,delta,delta) figure() imshow(array(im_21, "uint8")) axis('off') savefig("example5.png",dpi=300) show()1.5 實(shí)驗(yàn)結(jié)果
1.5.1 固定點(diǎn)位拍攝實(shí)現(xiàn)圖像拼接
1 拼接的效果不是很好 應(yīng)該是圖中物體的差異度也就是兩個(gè)屏幕和兩個(gè)音響的太類似導(dǎo)致特征的點(diǎn)的匹配出現(xiàn)錯(cuò)誤 而ransac算法起到的效果也很一般導(dǎo)致拼接效果不好 說明景色簡單的圖片直接的拼接是比較困難的
2 在拼接運(yùn)行時(shí)運(yùn)行的時(shí)間屬實(shí)多點(diǎn)久 因?yàn)閳D片的像素太大了 導(dǎo)致每一個(gè)像素點(diǎn)的映射需要很長的時(shí)間 可先將圖片進(jìn)行壓縮然后再進(jìn)行拼接可以很有效的改進(jìn)運(yùn)行時(shí)間
1.5.2 視差變化大的場景實(shí)現(xiàn)圖像拼接
拼接完后 近處紅色花和盆栽的部分出現(xiàn)了兩次 這是因?yàn)槠唇诱姨卣鼽c(diǎn)匹配的時(shí)候匹配點(diǎn)集中出現(xiàn)在遠(yuǎn)處的景色的 但是由于是在不同的位置進(jìn)行拍攝的 所當(dāng)進(jìn)行像素點(diǎn)映射的時(shí)候 會只照顧遠(yuǎn)處景色的拼接而導(dǎo)致近處的盆栽效果不好 可以清晰的看出來第二張圖片是斜著映射進(jìn)去的 而因?yàn)槲恢貌煌瑢?dǎo)致第一張圖片會有較大的與第一張圖片相同的景色單獨(dú)暴露出來
1.7 實(shí)驗(yàn)中遇到的問題
問題1
Traceback (most recent call last):File "F:PJ.py", line 7, in <module>from PCV.geometry import homography, warpFile "F:warp.py", line 128print 'warp - left' ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(print 'warp - left')? [Finished in 4.7s]因?yàn)榘姹镜膯栴} 在print后面要加括號
問題2
因?yàn)镻CV下面的warp.py里面的matplotlib.delaunay不再被使用了,所以把它換成一個(gè)相同功能的就可以:
①:把import matplotlib.delaunay as md 換成from scipy.spatial import Delaunay
②:warp.py里面的centers,edges,tri,neighbors = md.delaunay(x,y)換成tri= Delaunay(np.c_[x,y]).simplices就好啦
問題3
因?yàn)樗饕?我的圖像集有五張圖片 應(yīng)該給range后面數(shù)字改成5
總結(jié)
以上是生活随笔為你收集整理的计算机视觉python--全景图像拼接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统】模式切换篇
- 下一篇: 论文:Threat of Adversa