圖像的拼接----RANSAC算法


一、全景拼接的原理

1.RANSAC算法介紹
       RANSAC算法的基本假設是樣本中包含正確數據(inliers,可以被模型描述的數據),也包含異常數據(outliers,偏離正常范圍很遠、無法適應數學模型的數據),即數據集中含有噪聲。這些異常數據可能是由於錯誤的測量、錯誤的假設、錯誤的計算等產生的。同時RANSAC也假設,給定一組正確的數據,存在可以計算出符合這些數據的模型參數的方法。

2.使用RANSAC算法來求解單應性矩陣
        在進行圖像拼接時,我們首先要解決的是找到圖像之間的匹配的對應點。通常我們采用SIFT算法來實現特征點的自動匹配,SIFT算法的具體內容參照我的上一篇博客 。SIFT是具有很強穩健性的描述子,比起圖像塊相關的Harris角點,它能產生更少的錯誤的匹配,但仍然還是存在錯誤的對應點。所以需要用RANSAC算法,對SIFT算法產生的128維特征描述符進行剔除誤匹配點。

        由直線的知識點可知,兩點可以確定一條直線,所以可以隨機的在數據點集中選擇兩點,從而確定一條直線。然后通過設置給定的閾值,計算在直線兩旁的符合閾值范圍的點,統計點的個數inliers。inliers最多的點集所在的直線,就是我們要選取的最佳直線。

        

       RANSAC算法就是在一原理的基礎上,進行的改進,從而根據閾值,剔除錯誤的匹配點。首先,從已求得的匹配點對中抽取幾對匹配點,計算變換矩陣。然后對所有匹配點,計算映射誤差。接着根據誤差閾值,確定inliers。最后針對最大inliers集合,重新計算單應矩陣 H。

 

3.基本思想描述:
①考慮一個最小抽樣集的勢為n的模型(n為初始化模型參數所需的最小樣本數)和一個樣本集P,集合P的樣本數#(P)>n,從P中隨機抽取包含n個樣本的P的子集S初始化模型M;
②余集SC=P\S中與模型M的誤差小於某一設定閾值t的樣本集以及S構成S*。S*認為是內點集,它們構成S的一致集(Consensus Set);
③若#(S*)≥N,認為得到正確的模型參數,並利用集S*(內點inliers)采用最小二乘等方法重新計算新的模型M*;重新隨機抽取新的S,重復以上過程。
④在完成一定的抽樣次數后,若未找到一致集則算法失敗,否則選取抽樣后得到的最大一致集判斷內外點,算法結束。

 4.圖像拼接

使用RANSAC算法估計出圖像間的單應性矩陣,將所有的圖像扭曲到一個公共的圖像平面上。通常,這里的公共平面為中心圖像平面。一種方法是創建一個很大的圖像,比如將圖像中全部填充0,使其和中心圖像平行,然后將所有的圖像扭曲到上面。由於我們所有的圖像是由照相機水平旋轉拍攝的,因此我們可以使用一個較簡單的步驟:將中心圖像左邊或者右邊的區域填充為0,以便為扭曲的圖像騰出空間。
二、實驗

1.源代碼

復制代碼

 

復制代碼

 

 
        
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift

# set paths to data folder
featname = ['C:/Users/LE/PycharmProjects/untitled/hh/' + str(i + 1) + '.sift' for i in range(4)]
imname = ['C:/Users/LE/PycharmProjects/untitled/hh/' + str(i + 1) + '.jpg' for i in range(4)]

# extract features and match
l = {}
d = {}
for i in range(4):
sift.process_image(imname[i], featname[i])
l[i], d[i] = sift.read_features_from_file(featname[i])

matches = {}
for i in range(3):#2
matches[i] = sift.match(d[i + 1], d[i])

# visualize the matches (Figure 3-11 in the book)
for i in range(3):#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 elsewhere
fp = 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(1)
H_12 = homography.H_from_ransac(fp, tp, model)[0] # im 1 to 2

fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0] # im 0 to 1

# warp the images
delta = 1000 # for padding and translation

im1 = array(Image.open(imname[1]), "uint8")
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12, im1, im2, delta, delta)

im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)

figure()
imshow(array(im_02, "uint8"))
axis('off')
show()

 



 

復制代碼

 

復制代碼
 2.室外固定點位拍攝
數據集

 

 特征匹配

 

 

 

 圖像拼接

 

 

 

3.室內固定點位拍攝
數據集

 

 特征匹配

 

 

 

 

 圖像拼接

 

4.視差變化大拍攝

數據集

 

特征匹配

圖像拼接

 

 

 5.同一地點不同方位拍攝 

 數據集

 

特征匹配

 

圖片拼接

 

 三、實驗結果分析

通過四種不同場景的測試,可以看出:

室外固定點位拍攝的場景因為檢測到的特征點較多提高了匹配度, 雖然總體的拼接圖像在視覺上有點扭曲,但大致上都拼接出來了。

室內固定點位拍攝的場景,拼接效果比較理想,但由於圖像曝光度的不同,導致在圖像的邊界上存在邊緣效應,這也是該算法需要改進的地方。

室外同一地點不同角度拍攝場景,拼接效果最不理想,這是由於,雖然算法在特征匹配時匹配度很高,但是在進行拼接時,算法不會幫我們旋轉圖片的角度達到很好的拼接效果。

室外視察變化大拍攝的場景,按理來說應該檢索到的特征點很多,但拼接結果不是很理想,這是由於我拍攝時沒有盡可能的水平移動所導致,並且我的拍攝背景很相似,建築物比較對稱,所以也提醒大家拍攝測試圖像要注意:為了拼接出效果比較好的圖像,在保證有相同匹配點的情況下,拍攝圖像的間隔盡可能大一些。且一定要站在同一點,水平移動手機進行拍攝,就像拍攝全景圖那樣。若人拍攝的位置發生移動的話,算法可能就會因為找不到正確的點對而報錯,且最好不要拍攝那種對稱的建築物,且兩邊的的特征點長的幾乎一樣的。這樣會使算法的匹配出現失誤。

圖片像素越高會導致代碼運行較慢甚至報錯。

四、實驗中遇到的錯誤

1.代碼運行時出現

 

 解決方法:這是由於圖片像素沒有設置一致,將所有圖片像素設置相同得以解決,同時像素不能太大會降低運行速度,也不能過小,這樣提取的特征點不夠准確。

2.在解決問題1.后又遇到

 

 解決方法:這是因為拍攝的圖片沒有盡可能的水平位移,並且選取的場景盡量不要對稱。

3.解決完問題1和問題2后我又遇到了如下問題

 

 在百度,詢問同學嘗試多種方法后,此問題還是沒有解決,可能是與拍攝圖片本身有關,所以重新拍攝,以后找到解決方法再更新吧。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM