根據測試結果,兩種算法對於ubc、bikes、trees和boat四種圖集都有很好的魯棒性,能夠準確將圖像匹配起來。兩種算法的差異主要是在bark、graf、leuven和wall圖集中表現出來的。
方法/步驟
-
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的效率。
-
graf和wall圖集側重檢驗算法對視角變化的魯棒性。可以看到KAZE算法有效檢測的特徵數和成功匹配的點對數均比SIFT高,不過兩者都不能將graf圖集的Img1與Img6匹配起來,而SIFT算法也不能匹配出wall圖集的Img-1和Img-6.
-
leuven圖集側重於光照變化方面的檢驗。KAZE算法和SIFT算法都表現穩定,對光照變化不敏感。
在後期的進一步試驗發現,KAZE特徵的匹配對參數的設置比較敏感。我github上最新的樣例 azeOpenCV.cpp 中使用 BFMatcher 或 FlannBasedMatcher 進行特徵匹配,默認情況下會對匹配後的結果作初步過濾(filterMatches=true),篩選出小於2倍最小距離的配對特徵,然後再尋找Homography。實驗發現,這樣的初步過濾在大部分情況下可以有效排除冗餘配對的干擾,找出正確的Homography;但在極限情況下(例如視角變換大、明暗差異大、尺度差異大等),初步過濾又會減少配對數量,從而找不到有效的Homography。而SIFT則比較穩定,做不做過濾都能找到Homography。可能KAZE的描述向量還是有改進的空間,後期可以測試下用作者最新的G-SURF描述向量,或者用其它類型的描述符來搭配測試。