比較 KAZE 與 SIFT 的算法

根據測試結果,兩種算法對於ubc、bikes、trees和boat四種圖集都有很好的魯棒性,能夠準確將圖像匹配起來。兩種算法的差異主要是在bark、graf、leuven和wall圖集中表現出來的。

方法/步驟

  1. 1

    bark圖集主要檢驗特徵算法對旋轉和縮放的魯棒性。可見KAZE算法有效檢測的特徵點少於SIFT算法,而SIFT算法則能成功匹配所有5對圖像;我們可以發現,KAZE算法在尺度不變性上是遜於SIFT的,當縮放係數低於0.6以後,KAZE的正確匹配率就會明顯下降,而SIFT則能保持60%以上的正確匹配率。通過對SIFT的源碼分析可以知道,SIFT中每組Octave的層數nOctaveLayer默認爲3層,而組數nOctaves則是根據圖像的大小自動生成的:

       int nOctaves = actualNOctaves > 0 ? actualNOctaves : cvRound(std::log( (double)std::min( base.cols, base.rows ) ) / std::log(2.) - 2) - firstOctave;

        這使得 SIFT 能夠根據圖像尺寸選擇合適的尺度範圍,在不同尺度上都能檢測到關鍵點,保證其尺度不變性。測試中KAZE算法的nOctaves=2, nLayers=4,包含的尺度範圍較少。在源碼裏這兩個參數的調整需要使用者輸入。可以仿照SIFT那樣自動計算nOctave,但由於KAZE構造非線性尺度空間耗時較長,太多的nOctave卻會降低KAZE的效率。

  2. 2

    graf和wall圖集側重檢驗算法對視角變化的魯棒性。可以看到KAZE算法有效檢測的特徵數和成功匹配的點對數均比SIFT高,不過兩者都不能將graf圖集的Img1與Img6匹配起來,而SIFT算法也不能匹配出wall圖集的Img-1和Img-6.

  3. 3

    leuven圖集側重於光照變化方面的檢驗。KAZE算法和SIFT算法都表現穩定,對光照變化不敏感。

    在後期的進一步試驗發現,KAZE特徵的匹配對參數的設置比較敏感。我github上最新的樣例 azeOpenCV.cpp 中使用 BFMatcher 或 FlannBasedMatcher 進行特徵匹配,默認情況下會對匹配後的結果作初步過濾(filterMatches=true),篩選出小於2倍最小距離的配對特徵,然後再尋找Homography。實驗發現,這樣的初步過濾在大部分情況下可以有效排除冗餘配對的干擾,找出正確的Homography;但在極限情況下(例如視角變換大、明暗差異大、尺度差異大等),初步過濾又會減少配對數量,從而找不到有效的Homography。而SIFT則比較穩定,做不做過濾都能找到Homography。可能KAZE的描述向量還是有改進的空間,後期可以測試下用作者最新的G-SURF描述向量,或者用其它類型的描述符來搭配測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章