一、基本原理
1.1圖像拼接
1.2RANSAC算法
1.2.1 步驟
二、整體流程
三、圖像集
3.1圖像集BIG
3.2圖像集jia
3.3圖像集soft
3.4圖像集xiaoxue
四、代碼
五、實驗結果
六、實驗總結
七、遇到的問題
一、基本原理
1.1圖像拼接:
圖像拼接就是把多張有重疊部分的圖片拼接成一張無縫隙而且分辨率高的圖像,(多張圖像可以從不同的視覺、不同的時間、相同的視覺獲得)
1.2RANSAC算法:
RANSAC的全稱是“RANdom SAmple Consensus(隨機抽樣一致)”。它可以從一組包含“局外點”的觀測數據集中,通過迭代方式估計數學模型的參數。它是一種不確定的算法,也就是說它有一定的概率得出一個合理的結果,所以為了提高概率必須提高迭代次數。
1.2.1 步驟:
二、基本流程
1.針對某個場景拍攝多張圖像
2.計算第二張圖像跟第一張圖像之間的變換關系
3.將第二張圖像疊加到第一張圖像的坐標系中
4.變換后的融合、合成
5.在多圖場景中,重復上述過程
三、圖像集
圖像集BIG
圖像集jia
圖像集soft
圖像集xiaoxue
四、代碼
1 # -*- coding: utf-8 -*- 2 from pylab import * 3 from PIL import Image 4 from PCV.geometry import homography, warp 5 from PCV.localdescriptors import sift 6 7 # set paths to data folder 8 featname = ['D:/new/soft/' + str(i + 1) + '.sift' for i in range(3)] 9 imname = ['D:/new/soft/' + str(i + 1) + '.jpg' for i in range(3)] 10 11 # extract features and match 12 l = {} 13 d = {} 14 for i in range(3): 15 sift.process_image(imname[i], featname[i]) 16 l[i], d[i] = sift.read_features_from_file(featname[i]) 17 18 matches = {} 19 for i in range(2): 20 matches[i] = sift.match(d[i + 1], d[i]) 21 22 # visualize the matches (Figure 3-11 in the book) 23 for i in range(2): 24 im1 = array(Image.open(imname[i])) 25 im2 = array(Image.open(imname[i + 1])) 26 figure() 27 sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True) 28 29 30 # function to convert the matches to hom. points 31 def convert_points(j): 32 ndx = matches[j].nonzero()[0] 33 fp = homography.make_homog(l[j + 1][ndx, :2].T) 34 ndx2 = [int(matches[j][i]) for i in ndx] 35 tp = homography.make_homog(l[j][ndx2, :2].T) 36 37 # switch x and y - TODO this should move elsewhere 38 fp = vstack([fp[1], fp[0], fp[2]]) 39 tp = vstack([tp[1], tp[0], tp[2]]) 40 return fp, tp 41 42 43 # estimate the homographies 44 model = homography.RansacModel() 45 46 fp, tp = convert_points(1) 47 H_12 = homography.H_from_ransac(fp, tp, model)[0] # im 1 to 2 48 49 fp, tp = convert_points(0) 50 H_01 = homography.H_from_ransac(fp, tp, model)[0] # im 0 to 1 51 52 # warp the images 53 delta = 1000 # for padding and translation 54 55 im1 = array(Image.open(imname[1]), "uint8") 56 im2 = array(Image.open(imname[2]), "uint8") 57 im_12 = warp.panorama(H_12, im1, im2, delta, delta) 58 59 im1 = array(Image.open(imname[0]), "f") 60 im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta) 61 62 figure() 63 imshow(array(im_02, "uint8")) 64 axis('off') 65 show()
五、實驗結果
室內場景
近景
5.1sift特征匹配:
拼接結果:
遠景:
sift特征匹配:
拼接結果:
小結:這兩組圖像都是室內拍的,遠景圖像的特征點比較豐富,近景的比較單一,比較近景和遠景的拼接結果圖,遠景的拼接圖貌似更加的完整,並且拼接的縫隙也比較小,比較平滑。在相同的光照下,我只是改變了位置,條件都差不多,只有特征點的豐富程度,所以我認為圖像的拼接效果跟特征點的豐富程度有關,特征點越豐富的,圖像的憑借效果就越好。
室外場景
遠景
5.2sift特征匹配:
拼接結果:
近景
sift特征匹配:
拼接結果:
小結:室外場景我共拍了兩組,一組遠的一組近的,實驗室線提取圖像的sift特征,然后鏈接相同特征點,然后在進行拼接,從拼接結果可以看出來遠景拼接效果比近景好,遠景的拼接和原場景一樣,沒有發生什么扭曲,拼接的縫隙很小,看起來很平滑,我認為可能是遠景的特征點比較多,匹配的點也就更加的多,便於拼接出一幅平滑的圖像。近景的效果看出從拼接結果圖可以看出出現了明顯的扭曲(窗戶位置)和拼接縫隙,但是這幅圖像存在近景和遠景,出現瑕疵的地方是在遠的地方,所以我認為可能跟拍攝的圖像的光線亮度有問題,遠處相對來說比較亮,近處比較暗。
六、實驗總結
1、圖像的像素不能過大也不要過小,我的圖像都改成了500*500,修改的原因是為了避免浪費時間和造成不必要的失敗概率。
2、圖像拍攝時從不同的角度的,我們存儲圖像的順序要從右到左,因為這個實驗的代碼是從你命名的圖像的第一張從右到左開始拼接的。
3、圖像的拼接效果可能跟特征點的匹配程度和亮度有關,匹配程度越高的拼接效果就越好。如果要拼接的圖像含有近景和遠景的,遠景中如果亮度過暗拼接效果就會降低。
七、遇到的問題
運行代碼是出現報錯
ValueError: did not meet fit acceptance criteria
然后我百度看了別人的解決方法,重然后我就新拍了一組圖像,把圖像集的圖像像素全部改成了500*500,每張圖像都水平着拍,再次運行就成功了。