CV 兩幅圖像配準

圖像配准算法通常可分爲: 1、基於圖像灰度統計特性配準算法;2、基於圖像特徵配準算法;3、基於圖像理解的配準算法。算法

其中,算法類型二最廣泛,基於特徵的圖像配准算法的核心步驟爲:1.特徵提取、2.特徵匹配、3.模型參數估計、4.圖像變換和灰度插值(重採樣)。數組

圖像配準必須得考慮3個問題: 分別是配準時所用到的空間變換模型、配準的類似性測度準則以及空間變換矩陣的尋優方式。函數

1) 空間變換模型 ,是指的這兩幅要配準的圖像之間的映射模型,好比只有旋轉、平移這些操做,那就是剛體變換模型,又好比有縮放操做,甚至X方向和Y方向縮放的幅度都還不同,那就是仿射變換或者非線性變換模型。總之你要作配準,先要肯定這兩幅圖像之間是一種什麼樣的映射模型。要是對這個變換模型還不清楚,你就到google上或者萬方上搜索「仿射變換」、「剛體變換」這些關鍵詞。帖子裏不可能講的太詳細。
2) 配準的類似性測度準則 。在你肯定了變換模型後,接下去要作什麼?固然是肯定模型裏的參數了,而要肯定這些參數(不一樣的變換模型參數個數是不同的,像剛體變換有x平移、y平移和旋轉角度sita三個參數,仿射變換有6個參數)你得告訴程序什麼參數是最好的,或者說是正確的。那麼判斷什麼參數是正確的一個準則就是咱們說的配準的類似性測度準則,也就是告訴程序在某組參數下是配準的程度是多少,顯然使得配準程度最好的那組參數就是咱們要找的參數。

3)空間變換矩陣的尋優方式。由於大多數狀況下,模型中的參數不是靠解出來的,而是要靠「嘗試-判斷」這種方式去尋找,空間變換矩陣的尋優說白了也就是怎麼對這些參數進行尋優,找出使得配準程度最好的那一組參數的過程。這裏有不少方法,如遺傳算法、粒子羣優化算法等等,若是你對這些算法都不瞭解,沒辦法,你只有用最笨的遍歷式搜索方法了,也就是以某一個步距,搜索全部的參數組合方式,而後找出使得按照類似性測度準則配準程度最高的那一組參數。優化

 

舉例說明:好比有一幅圖像A,我將A左移了2個像素,再往下移了3個像素,又順時針旋轉了60度,這時的圖像咱們稱做B。若是咱們要對A和B進行配準,其實就是肯定二、三、60這三個參數的過程,由於這三個參數一旦肯定了,我就知道了B和A的對應關係,換句話說對於B中的任何一個像素點我就知道在A中對應的是哪一個點。這裏由於我知道這兩幅圖只有平移和旋轉的變換操做,因此咱們採用的模型是剛體變換模型(實際狀況下,你若是不知道這兩幅圖像進行了什麼變換操做,只有大概根據圖像的位置信息揣測了,通常狀況下非線性變換模型是最正確的,可是參數也最多)。配準的類似性測度準則這裏咱們就用簡單點的(只是舉個例子說明下過程,事實上的許多狀況都要複雜的多),以二值化後兩幅圖像重合的像素點個數爲準,也就是說咱們認爲使得兩幅圖像重合的像素最多的那組參數就是正確的變換參數,理論上來說,若是兩幅圖像嚴格配準了,那麼顯然他們全部的像素點都是重合的,不然就有錯開的部分。尋優方法比較囉嗦,任何一個優化算法都不是幾句話說的明白的,這裏直接用遍歷搜索法吧。由於有三個參數須要尋優所以,咱們對這三個參數的解空間進行遍歷,好比對X方向的平移像素個數咱們從-100搜索到+100,步距爲1像素,對Y方向的平移像素咱們也從-100搜索到+100,步距爲1像素,對旋轉角度咱們從0搜索到360度,步距爲1度。這樣等於說要完成一個200*200*360次的循環,而後在每次循環裏面,咱們都判斷一下,按照當次循環參數進行變換後的A圖像與B圖像的重合像素個數有多少,找出200*200*360次循環中使得重合像素個數最多的那組循環中所使用的參數,這組參數就是咱們所要的結果,若是一切正常,顯然咱們會在2,3,60這組參數所在循環中獲得重合像素個數最多的結果。而所謂優化算法其實就是用一種更爲智能的方式獲得2,3,60這三個參數的過程。這樣就完成了配準的過程。this

 

多項式模型在兩幅圖像上找到足夠的同名點對,而後用多項式模型強行糾正。大小、旋轉、噪聲等都不是問題。 google

本身構造算法的話,能夠這樣。假設A爲正確位置的圖像,B是待校訂的圖像。B圖上的任意一點(x,y),在校訂後圖像上的位置應該爲(u,v)有(假設多項式爲2階):spa

u = a0 + a1*x + a2*y + a3*x2 + a4*y2 + a5*x*ycode

v = b0 + b1*x + b2*y + b3*x2 + b4*y2 + b5*x*yorm

在B圖上散佈取x,y值,在A圖的同名點上取u,v值,當點數足夠時,解a、b共12個參數。ip

獲得方程後,遍歷b圖全部像元點x,y帶入上述公式,就獲得了所有配準後的位置u,v。

自動獲取同名點比較困難些,其它容易。這個能夠多階,但若是像你說的非剛性變化通常3階就夠了。 


兩點線段匹配:選取兩幅圖的兩個應該相同的點(一共4個點),獲得4個點的座標,而後用A圖的兩點線段與B圖的兩點線段計算出仿射變換的矩陣,再把矩陣應用於整幅圖就好了。看看opencv吧,好多現成的API函數。

 

六參數配準(仿射變換)具體求法:一共是6個參數,座標軸的變化夾角,旋轉夾角,X尺度變化,Y尺度變化,X平移,Y平移。

進行一系列運算事後,能夠變成一個線性代數式(具體怎麼變換的不用管,比較複雜)

u = Ax + By + C

v = Dx + Ey + F

其中,U,V是目標圖的橫縱座標,X,Y是原圖橫縱座標.也就是說

[u v 1]'=[ A B C;D E F;0 0 1]*[x y z]'

具體A-F六個參數的計算能夠經過SIFT在兩張圖中找到足夠的尺度不變特徵點,而後對這些特徵點進行匹配。匹配後就能獲得不少特徵點對。而後創建

u = Ax + By + C

v = Dx + Ey + F

這樣的方程。一共3對特徵點,6個方程,就足夠解6個參數了。可是實際上矩陣空間內三個遠遠不夠。通常要把全部的一塊兒拿來解超定方程組。

至於特徵點匹配,SIFT應該能算出128位特徵描述子,用兩個點之間的特徵描述子的歐式距離能夠實現匹配。另外要速度優化的話能夠不算這個,直接用灰度相關係數和一些其餘算法來排除誤匹配,好比ransac。其實128位特徵描述子只有在進行初始配準的時候有用。並且128位空間的歐氏距離計算開銷大,通常都用的正交反餘弦來逼近。因此乾脆不算這個東西,時間開銷一下就少了70%以上。那麼只知道一些特徵點,用什麼來進行初始匹配呢?方法就是用特徵點之間的灰度相關係數,這個是很輕量級的。

 

總之,配準問題要實驗,看結果,分析,再作改動,很難說有個算法能必定解決的。

須要考慮的可能問題包括:

resize分辨率,再作進一步處理的,控制特徵點數量。

平滑去噪。 

減小亮度對比度差別,用image normalization,就是先求圖的mean,std,而後把全部pixel變換,使得最終mean是0,std是1.

surf算法、SIFT算子、Harris角點提取。

 

關於Image Alignment,推薦論文: Lucas-Kanade 20 years On: compositional algorithm,它是最慢的,不過根據個人經驗來看,z在變換並非特別大的時候,還蠻好用的。它適用於translation,scaling,rotation變換,尋找最優過程相似於用gradient of multi-variable function 尋找 local minimum。 可是假如變換太大,這個方法應該不行。關於代碼,http://www.codeproject.com/KB/recipes/ImgAlign.aspx。 Remark:若是圖像裏有太多非剛性變換,忽略全部的推薦。

Shi-Tomasi角點特徵+Lucas-kanade(光流).Harris's original definition involved taking the determinant of H(p), subtracting the trace of H(p) (with some weighting coefficient), and then comparing this difference to a predetermined threshold. It was later found by Shi and Tomasi [Shi94] that good corners resulted as long as the smaller of the two eigenvalues was greater than a minimum threshold. Shi and Tomasi's method was not only sufficient but in many cases gave more satisfactory results than Harris's method

相關文章
相關標籤/搜索