當(dāng)嘗試在不同圖像之間進(jìn)行特征匹配時,通常會遇到圖像的大小、方向等參數(shù)發(fā)生改變的問題,簡而言之,就是尺度變化的問題。每幅圖像在拍攝時與目標(biāo)物體的距離是不同的,因此要識別的目標(biāo)物體在圖像中自然會存在不同的尺寸。 因此,計算機(jī)視覺中引入尺度不變的特征,主要的思想是每個檢測到的特征點都伴隨對應(yīng)的尺度因子。1999年David Lowe提出了著名的尺度不變特征檢測器SIFT(Scale Invariant Feature Transform)算法,它具有尺度,旋轉(zhuǎn),仿射,視角,光照不變性。而加速魯棒特性特征SURF(Speeded Up Robust Features)算法是SIFT的高效變種。這兩個算法申請了專利保護(hù),其專利的擁有者為英屬哥倫比亞大學(xué)。 關(guān)于SIFT和SURF的特征介紹,已經(jīng)有很多的blog對其進(jìn)行簡介了,見參考的blog。由于還沒有將2004年那篇原文精細(xì)看完,因此這里只能粗淺地分析兩種算法,并描述在OpenCV中如何實現(xiàn)這兩種算法的特征檢測。 一、基本概念 1.1 算法背景 尺度不變特征轉(zhuǎn)換SIFT是一種著名的計算機(jī)視覺的算法,主要用來檢測圖像中的局部特征,通過在圖像中尋找極值點特征,并提取出其這些特征點的位置、尺度和旋轉(zhuǎn)不變量等信息。 局部影像特征的描述與偵測可以幫助辨識物體,SIFT 特征是基于物體上的一些局部外觀的興趣點而與影像的大小和旋轉(zhuǎn)無關(guān)。對于光線、噪聲、些微視角改變的容忍度也相當(dāng)高。基于這些特性,它們是高度顯著而且相對容易擷取,在母數(shù)龐大的特征數(shù)據(jù)庫中,很容易辨識物體而且鮮有誤認(rèn)。使用 SIFT特征描述對于部分物體遮蔽的偵測率也相當(dāng)高,甚至只需要3個以上的SIFT物體特征就足以計算出位置與方位。在現(xiàn)今的電腦硬件速度下和小型的特征數(shù)據(jù)庫條件下,辨識速度可接近即時運(yùn)算。SIFT特征的信息量大,適合在海量數(shù)據(jù)庫中快速準(zhǔn)確匹配。(來自百度百科的解釋) 1.2 SIFT算法的主要優(yōu)點
1.3 SIFT算法的適用環(huán)境 目標(biāo)的自身狀態(tài)、場景所處的環(huán)境和成像器材的成像特性等因素影響圖像配準(zhǔn)/目標(biāo)識別跟蹤的性能。而SIFT算法在一定程度上可解決:
SIFT算法的實質(zhì)是在不同的尺度空間上查找關(guān)鍵點(特征點),并計算出關(guān)鍵點的方向。SIFT所查找到的關(guān)鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區(qū)的亮點及亮區(qū)的暗點等。 1.4 算法的基本步驟 Lowe將SIFT算法分解為如下四步:
1.5 SIFT算法的缺點 SIFT算法十分強(qiáng)大,精度很高,Mikolajczyk和Schmid曾經(jīng)針對不同的場景,對光照變化、圖像幾何變形、分辨率差異、旋轉(zhuǎn)、模糊和圖像壓縮等6種情況,就多種最具代表性的描述子(如SIFT,矩不變量,互相關(guān)等10種描述子)進(jìn)行了實驗和性能比較,結(jié)果表明,在以上各種情況下,SIFT描述子的性能最好。但算法的高深同樣帶來了一些缺點,如:
針對這些問題,一些改進(jìn)算法應(yīng)運(yùn)而生,SURF就是廣為人知的其中一種算法。 2.1 SURF算法介紹 SURF算法是SIFT算法的高效變種,在滿足一定效果的情況下完成兩幅圖像中物體的匹配,并基本實現(xiàn)了實時處理。SURF也檢測空間域和尺度域上的局部極大值作為特征,但是使用的是Hessian行列式響應(yīng)而不是Laplacian行列式。 SURF的實現(xiàn)如下,首先對每個像素計算Hessian矩陣以得到特征,該矩陣測量一個函數(shù)的局部曲率,定義如下: 該矩陣的行列式給出曲率的強(qiáng)度,定義角點為具有較高局部曲率的像素點(即在多個方向都具有高曲率)。由于該函數(shù)是由二階導(dǎo)數(shù)組成,因此可以使用不同的 所有這些不同尺度的運(yùn)算都很耗時,而SURF算法的目的是盡可能高效。因此會使用近似的高斯核,僅涉及少量整數(shù)加法,結(jié)構(gòu)如下圖所示: 左側(cè)的核用于估計混合二階導(dǎo)數(shù),右側(cè)的核則用于估算垂直方向的二階導(dǎo)數(shù),而其旋轉(zhuǎn)版本則用于估計水平方向的二階導(dǎo)數(shù)。 一旦識別了局部極大值,每個特征點的精確位置可以通過空間域及尺度域上進(jìn)行插值獲取,結(jié)果是一組具有亞像素精確度的特征點,以及一個對應(yīng)的尺度值。 2.2 性能比較 無需贅述,A comparison of SIFT, PCA-SIFT and SURF 一文給出了SIFT和SURF的性能比較,對原圖像進(jìn)行尺度、旋轉(zhuǎn)、模糊、亮度變化、仿射變換等變化后,再與原圖像進(jìn)行匹配,統(tǒng)計匹配的效果,源圖片來源于Graffiti dataset。 這里使用的開發(fā)平臺是Qt5.3.2+OpenCV2.4.9。SURF、SIFT特征在OpenCV中的實現(xiàn)均使用了cv::FeatureDetector接口,OpenCV中的opencv_nonfree模塊包含了SURF和SIFT的相關(guān)函數(shù),因此在使用時注意添加相關(guān)的頭文件。在這里,特征點的計算基于浮點核,因此這兩種算法相比其他算法在空間和尺度檢測上更加精確,但相對耗時。 至于理論部分有待進(jìn)一步學(xué)習(xí)。 二、實現(xiàn)SIFT特征檢測算法 直接在Qt中創(chuàng)建一個控制臺項目,在main函數(shù)中添加:
效果如下,在函數(shù)cv::drawKeypoints中我們使用cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS作為標(biāo)志位,這樣唉使用DRAW_RICH_KEYPOINTS之后每個關(guān)鍵點上圓圈的尺寸與特征的尺度成正比: 三、實現(xiàn)SURF特征檢測算法
效果: 從兩種算法的輸出結(jié)果可以看出,SURF與SIFT描述子的區(qū)別主要是速度及精度。SURF描述子大部分基于強(qiáng)度的差值,計算更加快捷,而SIFT描述子通常在搜索正確的特征點時更加精確。 參考資料: David G.Lowe Object Recognition from Local Scale-Invariant Features. 1999. David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004. SIFT官網(wǎng)的Rob Hess hess@eecs.oregonstate.edu SIFT源碼 參考博客: http://blog.csdn.net/zddblog/article/details/7521424 (個人認(rèn)為是目前最詳盡的SIFT介紹) http://underthehood.blog.51cto.com/2531780/658350 http://blog.csdn.net/xiaowei_cqu/article/details/8069548 http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html //--------------------------------------------------------------- 轉(zhuǎn)自:http://www./Article/27566 感謝分享 //--------------------------------------------------------------- |
|