在去年的時候,在GDAL的郵件清單中發現有人提出要在GDAL中添加自動提取匹配點(GCP)的演算法,在經過了將近半年的時間,GDAL中的匹配演算法終於有了實質性的進展。在目前GDAL的開發版本(GDAL1.10beta)中已經提交,該匹配演算法是基於SURF演算法來實現的。
實現該演算法的人叫Andrew Migal,郵件地址為:migal.drew@gmail.com。同時在實現SURF演算法的時候,Andrew通過部落格記錄了所有的過程,有興趣的童鞋可以訪問這裡看看:http://correlatorgsoc2012.blogspot.com。
在Andrew研究SURF的時候,最初寫了一個C#版本的程式,代碼掛靠在github上,為:https://github.com/migal-drew/SimpleSURF_csharp。之後又寫了一個基於GDAL庫的C++代碼,代碼為:https://github.com/migal-drew/GDAL-correlator。不過我記得這個C++版本的好像需要FLANN的庫才能編譯過去,不知道之後有沒有修改。最後在GDAL庫中也有相關的代碼,有興趣的童鞋可以更新開發版本的GDAL看看原始碼。
目前比較遺憾的是,對於SURF演算法,還不支援大影像處理,看來處理的時候只能自己分塊來處理了。
下面是用andrew的C#版本程式處理了一下,感覺速度很快,比SIFT要快不少。對比的SIFT庫是Rob Hess維護的SIFT庫,同時測試資料也是使用Rob Hess庫中裡面的beaver和beaver_xform。
beaver
beaver_xform
上面兩個映像找到的特徵點如所示,使用SURF閾值為0.001,分別找到了57個和59個特徵點。如所示:
接下來使用匹配閾值為1,進行匹配,發現只剩下了7對點,其中有一個明顯是錯誤的(尾巴上的最右側的那個點),如所示:
點匹配的結果如所示。通過簡單的直觀感覺,SURF確實要比SIFT快很多,(通過這兩個庫可以比較一下,SIFT是C++的庫,SURF是C#的庫,C#的運行效率肯定不及C++的高),尤其是在尋找特徵點的時候,SURF的速度要比SIFT快很多,當然由於兩者的參數沒有進行相同的設定,可能也會影響速度。