或許不少朋友會好奇其中的神祕,好比說爲何不一樣角度拍攝的圖片拼接的時候能夠自動對齊(略準確來說也就是如何處理圖片之間的仿射畸變和透視失 真);如何能自動找到圖片之間能夠粘連的部分而且準確無誤地拼接在一塊兒;如何平衡圖片之間光線色調的差別等等。其實每一步的背後或多或少都有比較複雜卻又 至關精妙的技術和算法,因此此次嘗試用比較直觀的方式給你們介紹一下每一步的工做原理,逆轉對前沿科技「雖不明但覺厲」的見解。算法
那麼先描述一下整個流程:數據庫
---圖片之間---
1. 特徵點匹配:找到素材圖片中共有的圖像部分。
2. 圖片匹配:鏈接匹配的特徵點,估算圖像間幾何方面的變換。網絡
---全局優化和無縫銜接---
3. 全景圖矯直:矯正拍攝圖片時相機的相對3D旋轉,主要緣由是拍攝圖片時相機極可能並不在同一水平線上,而且存在不一樣程度的傾斜,略過這一步可能致使全景圖變成波浪形狀。
4. 圖像均衡補償:全局平衡全部圖片的光照和色調。
5. 圖像頻段融合:步驟4以後仍然會存在圖像之間銜接邊緣、暈影效果(圖像的外圍部分的亮度或飽和度比中心區域低)、視差效果(由於相機透鏡移動致使)。dom
----------------(一)特徵點匹配----------------測試
合成全景圖的第一步是提取而且匹配全部素材圖片的局部特徵點。優化
1. 什麼是特徵點?spa
廣泛來說,一張圖片所包含的特徵點一般就是周圍含有較大信息量的點,而僅經過這些富有特徵的局部,基本就能夠推測出整張圖片。好比說物體的棱角、夜景閃耀的星星,或是圖片裏的圖案和花紋。3d
圖中框內即爲判斷富有特徵的部分。rest
實 際上人在識別某個東西或是圖案的時候也是經過觀察這個物體具備哪一種特徵,而後與本身的經歷和記憶所匹配。舉例來講,去超市看到一個水果,假設咱們觀察到這 個水果是綠色(顏色特徵),球形(形狀特徵),有黑色紋路(圖案特徵)。因而咱們能夠經過經驗判斷出這是個西瓜。固然人還會經過各類其餘特徵來加強對物體 的判斷力,只是整個從收到信息到作出判斷的過程行雲流水,甚至本身都察覺不到。這就是生物視覺的精妙之處,只惋惜距離破解生物視覺系統目前看來彷佛還是遙 不可及,因此在神經網絡破解並模擬生物大腦的運做以前就先由計算機視覺來承擔這個重擔了。
稍稍有些跑題,那麼繼續以前的問題:提取何種特徵?而且如何提取特徵?orm
如 前面所說,一幅圖片具備形形色色各類特徵,簡單的能夠是顏色、形狀或圖案,複雜的好比說能夠是圖案的自類似性(是否存在相似重複性圖案)或是整個場景裏其 他的物體(比如說在超市的水果架上咱們能夠更能確信西瓜就是西瓜,而水果架這個背景即爲特徵)。實際上提取這些特徵在計算機視覺領域裏也佔有至關重要的位 置,畢竟好的特徵選擇是整個識別系統能夠成功運轉的大前提。
[理論部分]
在合成全景圖的流程裏運用的是「點匹配」,也就是匹配局部圖片信息。由於局部圖片能提取的特徵有限,好比說形狀特徵在這種狀況就不適宜,因此通常採用經過整個局部的圖案來判斷是否符合做爲特徵的條件。其中運用最廣泛的爲SIFT特徵(Scale-invariant feature transform),即尺度不變特徵轉換。 其應用範圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型創建、手勢辨識、影像追蹤和動做比對。此算法由 David Lowe 在1999年所發表,在急速發展的計算機視覺領域內至今仍然被廣泛認爲是最好的(即State of the art)特徵偵測與描述算法。
提取SIFT特徵分爲兩步:偵測與描述(造成特徵向量)。
簡 單來說,偵測就是掃描圖片全部的尺度下的全部位置(尺度能夠理解爲局部縮放)。而判斷一個點做爲特徵點合不合格,須要計算在這個尺度下的高斯差 (DoG,Difference of Gaussians)的局部極值(Local Extrema)。如第一張圖所示,每個尺度(Scale)下對局部影像進行不一樣尺度的高斯模糊(局部影像與高斯濾波器的卷積)取差值。局部極值計算方 式如第二張圖所示,將測試像素的DoG的數值與其26個鄰接像素比較取其最大最小極值,也就是測試像素的「特徵度」 。
即使找到了特徵點,單純匹配特徵點周圍的局部影像是行不通的。首先SIFT特徵自己最大的優勢就是「位置、尺度、旋轉不變量",也就是說在必定範圍內旋轉或是拉遠拉近相機,能夠檢測出相同的特徵點位置(Repeatability)以及提取出相同的特徵向量(Scale & Rotation Invariant), 因此不一樣角度條件拍攝的圖片才能夠經過SIFT特徵匹配。而像素數值是不具有這些特色的。再者局部影像的像素信息量大致使匹配效率低下。假設這個局部大小 設爲16*16像素大小,每個像素值對應RGB 3個數值,那麼每一個特徵點就對應一個786維的向量(也就是每一個點要用786個數表示),考慮到尺度與旋轉不變量這個向量又須要乘上十幾倍甚至幾十倍以覆 蓋全部的變化,假設一個圖片若是包含上千個特徵點,而數據庫包含上千張圖片,那麼在匹配時龐大的計算量無疑是對CPU的一場災難。
爲了保證提取出來的特徵向量具備「旋轉不變量」 的特性,首先要作的是在每一個特徵點找到一個「方向」,而這個方向和局部圖像的特性應當是一致的,也就是說理想狀態下若是旋轉這個局部圖片,那麼從新提取這 個"方向"也和以前相比旋轉相同角度。SIFT裏選擇這個角度的方式是在高斯模糊以後的局部圖片裏計算每個像素點的"角度"與"大小",以後進行投票選 出全部像素最多的那個角度做爲主方向。下圖爲計算這個角度和大小的公式,看似很長實際上只是計算橫豎相鄰像素之間的差值和(m)和角度(θ)。
因而局部圖像產生的差值和角度能夠經過這種方式造成特徵向量(或稱爲關鍵點描述子 - Keypoint Descriptor)。
形 成這個向量的方式是"量化"這些角度(好比說把360度平均分紅8等分), 而後根據位置累計起來。上圖表示的是一個8x8的局部採樣計算出的2x2的特徵矩陣,實際上通常使用的是16x16局部採樣造成4x4特徵矩陣。因此若是 把這個矩陣拉成向量,也就是包含8*4*4 = 128個元素。
造成特徵向量以後下一個問題就是如何匹配了。 最基本的方式能夠稱做「最鄰近搜索」(Nearest Neighbour),實際上也就是找在128維空間上直線距離最近的的特徵向量,這個求直線距離的方式和2維無異,最近的特徵向量也就被認爲是互相匹 配。原做者使用的方式是增長了k-d tree算法來高效率地完成高維度上的最鄰近搜索。
[理論部分結束]
----------------(二)圖片匹配----------------
接 下來的目標就是找到全部匹配(也就是重疊)的圖片部分,接連全部圖片以後就能夠造成一個基本的全景圖了。由於每張圖片有可能和其餘每張圖片有重疊部分,所 以匹配所有圖片須要差很少匹配圖片個數的平方次。不過實際上每兩張圖片之間只須要那麼幾個相對精準匹配的點就能夠估算出這兩張圖像裏的幾何關係。
最廣泛的方式是用RANSAC(RANdom SAmple Consensus, 隨機抽樣一致),在這裏的用途就是排除掉不符合大部分幾何變換的匹配。以後利用這些匹配的點來"估算單應矩陣" (Homography Estimation),也就是把其中一張經過個關聯性和另外一張匹配的方法,在以後會詳細介紹。
上圖即爲用RANSAC找出符合幾何約束的特徵點以後,經過單應矩陣來對齊兩張圖片的內容。
【RANSAC】
[理論部分]
首先介紹一下RANSAC的 原理。RANSAC是一種迭代算法(Iteration Method),用來從觀測數據中估算出數學模型的參數,此基礎上即可以分離內羣(Inliers)與離羣(Outliers)數據。簡單來講就是通常來 講觀測的數據裏常常會出現不少噪音,好比說像SIFT匹配有時就會由於不一樣地方有相似的圖案致使匹配錯誤。而RANSAC就是經過反覆取樣,也就是從整個 觀測數據中隨機抽一些數據估算模型參數以後看和全部數據偏差有多大,而後取偏差最小視爲最好以及分離內羣與離羣數據。
下 圖這裡用一個簡單的例子來說明,在一組數據點中找到一條最適合的線。 假設,此有一組集合包含了內羣以及離羣,其中內羣為能夠被擬合到線段上的點,而離羣則是無法被擬合的點。若是我們用簡單的最小平方法來找此線,我們將無法 獲得一條適合於內羣的線,因為最小平方法會受離羣影響而影響其結果。而RANSAC,能夠只由內羣來計算出模型,並且機率還夠高。 然而,RANSAC無法保證結果必定最好,因此必須當心選擇參數,使其能有足夠的機率。
下圖是一個簡單的例子,用RANSAC來找出符合內羣的直線的參數(能夠看作是找y=ax+b裏的a和b),以及內羣數據自己。
之因此RANSAC能在有大量噪音狀況仍然準確,主要緣由是隨機取樣時只取一部分能夠避免估算結果被離羣數據影響。流程爲如下:(摘自維基)
須要補充這個流程的是:判斷數據是否符合模型的閾值以及重複多少次步驟是要自行定義的,而且決定了整個流程相對的準確度與運算時間。
總結一下的話,RANSAC算法的輸入爲:
1. 觀測數據 (包括內羣與外羣的數據)
2. 符合部分觀測數據的模型 (與內羣相符的模型)
3. 最少符合模型的內羣數量
4. 判斷數據是否符合模型的閾值 (數據與模型之間的偏差容忍度)
5. 迭代運算次數 (抽取多少次隨機內羣)
輸出爲:
1. 最符合數據的模型參數 (若是內羣數量小於輸入第三條則判斷爲數據不存在此模型)
2. 內羣集 (符合模型的數據)
優勢:能在包含大量外羣的數據中準確地找到模型參數,而且參數不受到外羣影響。
缺 點:計算參數時沒有一個最大運算時間的頂限,也就是說在迭代次數被限制的狀況下,得出來的參數結果有可能並非最優的,甚至可能不符合真實內羣。因此設定 RANSAC參數的時候要根據應用考慮「準確度與效率」哪個更重要,以此決定作多少次迭代運算。設定與模型的最大偏差閾值也是要本身調,因應用而異。還 有一點就是RANSAC只能估算一個模型。
[理論部分結束]
RANSAC應用於點匹配的效果,基於前圖:
匹配時不符合絕大多數幾何變換的判斷爲匹配錯誤並排除。
【Homography Estimation】
找到兩張圖裏正確的匹配以後就能夠利用這些點來估算兩張圖之間的幾何變換關係。簡單來講就是:假設固定其中一張圖在桌子上,如何擺放,旋轉,拉伸另外一張圖使其與第一張重合。
【待補充】
假設有一對匹配點, 和, 他們之間的單應矩陣即是下圖公式中的H。
【待補充】