圖像配准算法一般可分為: 一、基於圖像灰度統計特性配准算法;二、基於圖像特征配准算法;三、基於圖像理解的配准算法。
其中,算法類型二最普遍,基於特征的圖像配准算法的核心步驟為:1.特征提取、2.特征匹配、3.模型參數估計、4.圖像變換和灰度插值(重采樣)。
圖像配准必須得考慮3個問題: 分別是配准時所用到的空間變換模型、配准的相似性測度准則以及空間變換矩陣的尋優方式。
1) 空間變換模型 ,是指的這兩幅要配准的圖像之間的映射模型,比如只有旋轉、平移這些操作,那就是剛體變換模型,又比如有縮放操作,甚至X方向和Y方向縮放的幅度都還不一樣,那就是仿射變換或者非線性變換模型。總之你要做配准,先要確定這兩幅圖像之間是一種什么樣的映射模型。要是對這個變換模型還不清楚,你就到google上或者萬方上搜索“仿射變換”、“剛體變換”這些關鍵詞。帖子里不可能講的太詳細。
2) 配准的相似性測度准則 。在你確定了變換模型后,接下去要做什么?當然是確定模型里的參數了,而要確定這些參數(不同的變換模型參數個數是不一樣的,像剛體變換有x平移、y平移和旋轉角度sita三個參數,仿射變換有6個參數)你得告訴程序什么參數是最好的,或者說是正確的。那么判斷什么參數是正確的一個准則就是我們說的配准的相似性測度准則,也就是告訴程序在某組參數下是配准的程度是多少,顯然使得配准程度最好的那組參數就是我們要找的參數。3)空間變換矩陣的尋優方式。因為大多數情況下,模型中的參數不是靠解出來的,而是要靠“嘗試-判斷”這種方式去尋找,空間變換矩陣的尋優說白了也就是怎么對這些參數進行尋優,找出使得配准程度最好的那一組參數的過程。這里有很多方法,如遺傳算法、粒子群優化算法等等,如果你對這些算法都不了解,沒辦法,你只有用最笨的遍歷式搜索方法了,也就是以某一個步距,搜索所有的參數組合方式,然后找出使得按照相似性測度准則配准程度最高的那一組參數。
舉例說明:比如有一幅圖像A,我將A左移了2個像素,再往下移了3個像素,又順時針旋轉了60度,這時的圖像我們稱作B。如果我們要對A和B進行配准,其實就是確定2、3、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這三個參數的過程。這樣就完成了配准的過程。
多項式模型:在兩幅圖像上找到足夠的同名點對,然后用多項式模型強行糾正。大小、旋轉、噪聲等都不是問題。
自己構造算法的話,可以這樣。假設A為正確位置的圖像,B是待校正的圖像。B圖上的任意一點(x,y),在校正后圖像上的位置應該為(u,v)有(假設多項式為2階):
u = a0 + a1*x + a2*y + a3*x2 + a4*y2 + a5*x*y
v = b0 + b1*x + b2*y + b3*x2 + b4*y2 + b5*x*y
在B圖上散布取x,y值,在A圖的同名點上取u,v值,當點數足夠時,解a、b共12個參數。
得到方程后,遍歷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
