本文全文翻譯自http://ppwwyyxx.com/2016/How-to-Write-a-Panorama-Stitcher/。這是一個關於作者如何編寫OpenPano算法的一個總結,OpenPano是一個開源的全景拼接軟件。相關代碼在github上。
SIFT Feature
Lowe 的SIFT[1]算法實現放在feature/
目錄下。這個算法的流程和一些結果在這一章裏做簡單的介紹。
Scale Space & DOG Space
首先,一個尺度空間(Scale Space)由
高斯模糊通過兩個一維卷積實現,而不是一個二維卷積。這將顯著地加速該計算過程。
在每個層級(octave),計算每兩個相鄰的高斯模糊後圖片的差值,可以構建一個差分高斯空間(DOG)。DOG空間由
Extrema Detection
在DOG空間中,通過比較相鄰的三個方向26個像素來檢測所有的極大或極小值:
然後使用拋物線插補(parabolic interpolation)去搜索極值精確的
Orientation Assignment
首先,在尺度空間計算每個點的梯度和方向。在之前的流程中檢測到的每個關鍵點,根據他們的梯度幅度值作爲權重,將它的相鄰點的方向將累積起來並建立一個方向直方圖,權重由它們的梯度的幅度決定,
Descriptor Representation
Lowe建議[1]選擇關鍵點附近的16點來爲每個店建立一個方向直方圖並且合成爲一個SIFT特徵。每個直方圖使用8個從0到360度的不同的格子。一次結果特徵是一個128位浮點向量。因爲每個關鍵點的主方向是已知的,利用相對於主方向的相對方向,這個特徵是旋轉不變的。
利用論文[2]的建議,利用一個簡單修改的SIFT——RootSIFT,魯棒性更強。
Feauture Matching
這個128維描述子的歐氏距離是兩幅圖之間特徵匹配的距離標尺。如果一個點和他最近鄰和次近鄰的點之間的距離是相似的會被認定是不可信的而被拒絕。一次匹配的結果如下:
特徵匹配被認爲是最耗時的一步。所以我使用FLANN library去特徵向量中查詢兩個最臨近特徵。Intel SSE intrinsics被用來加速去計算兩個特徵向量的歐氏距離。
Transformation Estimation
Estimate from Match
衆所周知,對於任意兩幅相機在固定點拍攝的圖片,匹配對的齊次座標都能夠由一個單應變換矩陣聯繫起來,因此對於一對對應的點
單應矩陣是一個不考慮尺度影響的
當拍攝兩幅圖片時,相機僅存在平行於成像平面的旋轉和平移變換時(沒有視角申縮),那麼它們能夠通過一個仿射變換矩陣聯繫起來:
給定一組匹配點,以上的任何一個方程都能夠通過直接線性變換(Direct Linear Transform)估計出來。這些估計方法的實現放在
lib/imgproc.cc
中。具體參照[3]
然而這些方法對於噪聲的魯棒性並不強。實際上,由於錯誤匹配對的存在,RANSAC(Random Sample Consensus)算法[4]經常被用來在變矩陣的求解中剔除噪聲。在RANSAC的每一步迭代中,幾組匹配點對被隨機地選擇用來生成一個最佳的變換矩陣,並且和該矩陣一致的點對被看做是內點。在一定量的迭代後,擁有最多內點對的變換被看做最後的結果。該算法實現放在stitch/transform_estimate.cc
中。
Match Validation
在每次矩陣估計後,我對每個矩陣進行了優劣檢查(health check),以避免因爲錯誤的匹配對而產生畸變的變換估計。這個過程包括兩種檢查:(具體參見stitch/homography.hh
中)
- 單應變換
(H3,1,H3,2) 中的尺度參數不能太大。他們的絕對值應不能超過0.002。 - 跳動不能夠出現在圖像拼接過程中。如果
x
或y
座標發生了跳動那麼這個單應變換是不能夠被接受的。
再無限制地拼接中,有必要判斷兩幅圖是否匹配。上面流程中估計得到的大量內點能夠作爲一個評判尺度。然而,對於高分辨率圖片,即使執行了足夠多次的RANSAC迭代,也有可能實際上得到了一個有着大量內點的錯誤匹配。爲了解決這個問題,考慮到錯誤匹配在空間上通常是更加隨機分佈的,通過設置匹配之間的幾何限制條件能夠幫助找出錯誤匹配對出來。因此,在RANSAC完成後會返回一組內點,按照論文[5]中的建議,可以通過一些重疊檢測來進一步驗證匹配情況。
特別的,知道了一個候選的變換矩陣,通過計算變換對應角點的凸包,我能夠找出兩幅圖之間的重疊區域。在重疊區域被找到後就可以應用兩個濾波器了。
- 兩幅圖的重疊區域不能夠區別太大。
- 在重疊區域內,應該有足夠大比例的匹配點對是內點。我使用了內點率來描述該匹配的置信度。
由於錯誤的匹配可能是隨機和無規律的,這種方法能夠幫助濾除帶有錯誤幾何信息的誤匹配對。
Cylindrical Panorama
Necessity of Projection
給出一個單向的旋轉變換照片輸入,按照大多數全景拼接軟件的做法,採用平面單應變換會導致垂直畸變,如下圖:
這是因爲全景實際上是通過柱面或者球面鏡投拍攝得到,而並不再試平面鏡頭。在這種配置下,照片中草地上的面色圓圈其實一條直線。一個很好地解釋了這種投影生成原因的demo見此頁面。
處理這種問題的方式是在變換估計之前或者之後,通過柱面或者球面投影去畸變圖片。這和本系統中的兩種模式相對應。在這一節中我們將引入基於pre-warping的流水線方式,它被應用在柱面模式中。儘管需要很多的假設和一些技巧去是它良好的工作,這種流水線方式通常很好。它的實現放在stitch/cylstitcher.cc
目錄中。
Warp
我們在拼接的一開始,先將圖片投影到柱面,方程如下:
stitch/warp.cc
。一些畸變後的示例圖片如下圖。注意這要求提前知道相機的焦距,否則不會產生一個好的彎曲結果。
在將所有的圖片投影到了相同的柱面上後,可以通過估計圖片對之間的仿射變換來簡單的拼接圖片。並且通過選定一張特定的圖片作爲主圖進行疊加。注意到操場上的白色線變得更直了。
straightening
由於相機的傾斜角度是未知的,上面描述的柱面投影是假設相機是水平的。這個假設會導致扭曲,輸出的全景圖可能會是彎曲的:
選擇中間的圖片作爲基準有助於解決該問題。我發現了另一種有效地方法,這種方法通過搜索畸變方程中的
由於這種結果是因爲相機的傾斜造成的,
單獨改變
Camera Estimation Mode
Intuition
使用柱面投影去扭曲圖像到圓柱表面時,假設已知相機焦距並且要求所有相機有同樣的傾角向量。我們想要擺脫這些約束。
然而,如果只是簡單地估計成對的單應變換,去直接拼接它們,在變換後投影大柱面上,將會得到類似於下圖的結果:
注意到圖片實際上拼接的很好:匹配點對都很好地重疊了。但是整體的幾何結構被破壞了。
這是因爲
而且,注意刀
相機參數的這種不一致的過度參數化將會導致上述這種過擬合的結果出現,因而打亂了圖片潛在的內部幾何結構。
人們通常用
Initial Estimation
[6]首先給出了一種粗略估計所有相機焦距的方法。在給出了一張圖片所有的焦距和旋轉矩陣後,相對應圖片的旋轉矩陣可以通過我們已經得出的單應變換求得:
因此,該估計算法原理類似於最大生成樹算法:在建立一種匹配圖後,我首先選擇一張有着好的連接性質的圖作爲基準。然後,在每一步中,選擇一張還未被處理的最佳匹配圖片(考慮匹配置信度)那麼它的旋轉矩陣
stitch/camera_estimate.cc
文件中。
注意到,由於單應變換
如果不執行捆綁調整,由於初始估計的
爲了進一步的改善
Bundle Adjustment
我們通過如下方式規定
這裏,
一些迭代方法例如牛頓法,梯度下降法,levenberg-Marquardt算法,都能夠被用來解決這個優化問題。假定矩陣
- 梯度下降法:
∇θ=λJTr - 牛頓法:
∇θ=(JTJ)−1JTr - LM算法:
∇θ=(JTJ+λD)−1JTr,且D是對角矩陣
所有的迭代算法都涉及到計算矩陣
- 數值:對於每一個
θi ,振幅爲±ϵ ,分別計算r1,r2 。然後計算J[:,i]=r1−r22ϵ - 符號:根據微分運算的鏈式法則計算
∂r∂θ 。比如,相關的方程如下:
∂rk∂pij=−1,若rk=Xi−pij.否則爲0
∂pij∂p^ij=∂[xzyz]∂[x y z]=⎡⎣⎢⎢1z001z−xz2−yz2⎤⎦⎥⎥
∂p^ij∂fi=∂Ki∂uiRiRTjK−1jXj
∂p^ij∂ui=Ki∂Ri∂uiRTjK−1jXj
∂p^ij∂uj=KiRi(∂Rj∂ui)TRTjK−1jXj
∂K∂f=⎡⎣⎢100010000⎤⎦⎥
∂R∂ux=ux[u]x+[u×(I−R)ex]×||u||2R
最後一個方程來自於[7]。並且,我發現Lowe的論文[5]給出的方程是錯誤的:
由於
兩種方法的實現都存放在stitch/incremental_bundle_adjuster.cc
。由於符號方式僅僅計算稀疏矩陣
在一組
在優化後,上面的前景圖看起來將會更好:
Straightening
校直也是有必要的。按照論文[5]中建議的方式,由於相機傾角不明確,捆綁調整後的結果可能仍然存在波動現象。若假定所有相機的
來解決傾角和修復這種波動效應。
對比上面兩張圖,注意到草地上的直線被糾正了(它實際上是足球場上中心的一個圓)。
Blending
在完成所有的變換之後最終圖片結果的大小就確定了。然後結果圖片中的每個像素點的值通過逆變換和相鄰區域像素點的雙線性插值(可以消除鋸齒現象)確定。
對於重疊區域,每個重疊像素到圖像中心的距離被用來計算像素值的權值和。爲了得到更好的全景圖,我僅僅使用了
Cropping
當設置好了CROP
選項後,程序將從原始結果上找到一張最大的合法矩形。
我們使用的算法複雜度爲
對於每一行
對於每一個
參考文獻
[1]: Distinctive Image Features From Scale-invariant Keypoints, IJCV04
[2]: Three Things Everyone Should Know to Improve Object Retrieval, CVPR2012
[3]: Multiple View Geometry in Computer Vision, Second Edition
[5]: Automatic Panoramic Image Stitching Using Invariant Features, IJCV07
[6]: Construction of Panoramic Image Mosaics with Global and Local Alignment, IJCV00