映像配准演算法一般可分為基於映像灰階統計特性配准演算法、基於映像特徵配准演算法和基於映像理解的配准演算法。
基於特徵的映像配准演算法的核心步驟為:特徵提取、特徵匹配、模型參數估計、映像變換和灰階插值。
下面把論壇中一些人的看法在此總結一下,便於以後參考:
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/gordon3000" target="_blank">gordon3000:再兩幅映像上找到足夠的同名點對,然後用多項式模型強行糾正。大小、旋轉、雜訊等都不是問題。
自己構造演算法的話,可以這樣。假設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階就夠了。
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/littleplane" target="_blank">littleplane:時間效率要求如何,可以看看Sift演算法。
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/xpjandy" target="_blank">xpjandy:選取兩幅圖的兩個應該相同的點(一共4個點),得到4個點的座標,然後用A圖的兩點線段與B圖的兩點線段計算出坊射變換的矩陣,再把矩陣應用於整幅圖就行了。看看opencv吧,好多現成的API函數。
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/Aniao" target="_blank">Aniao:必然是六參數配准(仿射變換)啊。
具體求法:
一共是6個參數,座標軸的變化夾角,旋轉夾角,X尺度變化,Y尺度變化,X平移,Y平移。
進行一系列運算過後,可以變成一個線性代數式(具體怎麼變換的不用管,比較複雜)
u = Ax + By + C
v = Dx + Ey + F
其中,U,V是靶心圖表的橫縱座標,X,Y是原圖橫縱座標
也就是說
u A B C x
v = D E F * y
1 0 0 1 z
具體A-F六個參數的計算可以通過SIFT在兩張圖中找到足夠的尺度不變特徵點,然後對這些特徵點進行匹配。匹配後就能得到很多特徵點對。然後建立
u = Ax + By + C
v = Dx + Ey + F
這樣的方程。
一共3對特徵點,6個方程,就足夠解6個參數了。
但是實際上矩陣空間內三個遠遠不夠。一般要把所有的一起拿來解超定方程組。
u A B C x
v = D E F * y
1 0 0 1 z
你可能還是摸不著頭腦,其實是先用SIFT演算法找出兩張圖的尺度不變點,然後再對這些點進行匹配,然後把每一對匹配的點用來計算這個方程
據我所知,OPENCV沒有SIFT,不過有人用OPENCV實現過SIFT,可以搜尋。至於特徵點匹配,SIFT應該能算出128位特徵描述子,用兩個點之間的特徵描述子的歐式距離可以實現匹配。另外要速度最佳化的話可以不算這個,直接用灰階相關係數和一些其他演算法來排除誤匹配,比如ransac,另外還有俺畢業論文的新演算法。
其實128位特徵描述子只有在進行初始配準的時候有用。而且128位空間的歐氏距離計算開銷大,一般都用的正交反餘弦來逼近。所以乾脆不算這個東西,時間開銷一下就少了70%以上。那麼只知道一些特徵點,用什麼來進行初始匹配呢?方法就是用特徵點之間的灰階相關係數,這個是很輕量級的。
具體我可以給你看論文和代碼,但是代碼是MATLAB的。另外,裡面的剔除誤匹配也是很有趣的一個創新。不是ransac,沒有那麼學術派,而是淺顯易懂的東西
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/leodream" target="_blank">leodream:要做映像配准你必須得考慮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這三個參數的過程。
這樣就完成了配準的過程。
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/bitsun1983" target="_blank">bitsun1983:不知道你說的要配準是什麼意思. 是要看這兩個圖匹配不匹配?
如果是的話,就是先做image alignment,找到最優變換參數(樓上把該這點說的基本都說了),然後變換後再求兩個image difference,如果小於一定閥值,就是匹配,這個閥值需要你自己實驗,自己找。
我再補充下:
1,慎用SIFT,你這種近似於binary image,SIFT演算法我感覺不適用,提取的特徵點應該會及其不穩定,我個人經驗sift適用於普通的gray image,
附:opencv裡面沒sift的implementation,據說是應為sift已經被申請專利
2.減少亮度對比差異的影響的方法很簡單,用image normalization,就是先求圖的mean,std,然後把所有pixel變換,使得最終mean是0,std是1.
2.關於Image Alignment,推薦論文: Lucas-Kanade 20 years On: A Unifying Framework: Part1,整個TR48頁太長,我唯讀前10頁,我用了compositional algorithm,它是最慢的,不過根據我的經驗來看,z在變換並不是特別大的時候,還蠻好用的(當然我只用於普通gray image,理論上也適用於近似binary image)。它適用於translation,scaling,rotation變換,尋找最優過程類似於用gradient of multi-variable function 尋找 local minimum。 但是假如變換太大,這個方法應該不行
3,關於代碼,http://www.codeproject.com/KB/recipes/ImgAlign.aspx
好好讀讀剛才那論文,那個代碼基本你就能看懂了,否則就是看天書。
Remark:如果映像裡有太多非剛性變換,忽略我所有的推薦。
1,你是不是已經試過了SIFT演算法?雖然我高度質疑sift在這種場合的適用性,但是既然假如你已經實驗了,你可以大概粗略看看特徵點提取是不是穩定,不穩定的話後面的特徵點向量提取根本不用考慮了
2,你說記憶體溢出?是不是matlab裡面的out of memory 報錯啊。我不知道你用了什麼sift的implementation,但是還是我的感覺,sift不適用這樣的image,當然了,這方面我沒太多經驗,但是假如你確定你用的sift implementation是可信的,但是產生的key point幾千上萬了,你就應該想另外演算法了。
3,匹配完直接做binary image subtraction 應該會有很多誤判,也許你應該用morphological operation 去除一些 outliers,當然具體問題具體分析,我想能看到具體的圖應該能給出更詳細的建議吧。
無論如何都要resize到比較小的解析度再做進一步處理的,要不然你的特徵點會太多了。
總之這樣的問題你總是要實驗,看結果,分析,再做改動,很難說有個演算法能一定解決的。
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/xq830210" target="_blank">xq830210:在SPIE或者IEEE或者SpringerLink上找幾篇文章讀讀,關於映像配準的所有演算法在這幾個上面都有。
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/runley" target="_blank">runley:surf演算法 opecv2.0。
{
LogClickCount(this,111);
}" href="http://hi.csdn.net/swimmingfish2004" target="_blank">swimmingfish2004:Shi-Tomasi角點特徵+Lucas-kanade(光流)
learning Opencv,P318。
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.