本文初步計划分為四個部分。“基本概念”部分對局部特征識別方法進行總體了解;“
檢測算法”將按照一定順序對現有算法進行拆解;“
綜合實驗”部分將引入相關圖像庫為實際比較各種算法速度和准確率。其它部分都是對這三個主要部分的補充。
一、基本概念
“圖像局部
特征點的檢測、描述和比對”在“目標識別、圖像拼接、運動跟蹤、圖像檢索、自動定位”等研究中起着重要作用。OpenCV作為一款開放源代碼倉庫,收錄實現了多種具有代表性的檢測和描述算法。
其中包括以Harris為代表的角點算法、以Sift為代表的特征點算法和新出現的SimpleBlob 算法
等。
這些算法的理論和實現方面存在參考和借鑒的關系;在算法封裝的過程中也層面出“由分散到統一”的趨勢;從時間上也能夠看出
前后聯系、
角點算法包括:
1、Kitchen-Rosonfeld角點算法;
2、Canny邊緣檢測算法;
3、Harris角點檢測方法(
1988)
;
4、Shi-Tomasi角點檢測方法;
特征點方法包括:
1、
SIFT,Distinctive Image Features from Scale-Invariant Keypoints(1999-2004);
2、
SURF,Speeded Up Robust Features(2006-2008);
3、
FAST ,Machine Learning for High-speed Corner Detection(2006-2009);
4、
STAR,Censure: Center surround extremas for realtime feature detection and matching(2008);
5、BRIEF(2010);
6、
BRISK,BRISK: Binary Robust Invariant Scalable Keypoints(2011);
7、
ORB: an efficient alternative to SIFT or SURF(2011)
8、
FREAK 視網膜方法 (2012)
其中,即使是最新的FREAK算法也已經有10余年的歷史了,相關技術應用都已經比較成熟且深入。在進入深度學習和人工智能全面推開應用的今日,我們研究經典算法仍然是非常有意義的:
1、通過綜合實驗,能夠明確每一種算法能夠達到怎樣的識別質量和速度,對於解決實際問題提供重要參考;
2、通過對比研究,能夠在求圖像的一階微分、二階偏微分圖像上獲得很多實用技術,這對於我們解決圖像增強、識別問題都很有幫助;
3、通過研讀代碼,能夠觀看欣賞每一種算法的實現細節,由於特征點算法運算量比較大,所以經常能夠看到優化算法,極具參考價值。
另關於SimpleBlob 算法的應用可以參考這篇《OpenCV圖像處理中“找圓技術”的使用
》,這篇文章中比較了幾種OpenCV中的找圓方法並提出一種綜合應用方法,我認為已經比較完整,這里就不展開。
二、檢測算法
詳細的算法解析和實現請參考書籍《圖像局部特征檢測和描述--基於OpenCV源碼分析的算法與實現》,這里我僅從學習者和普通角度出發,對角點、特征點算法中具有特性的地方進行簡單思考。
1、
Kitchen-Rosenfeld是最早出現的角點算法,解決“從0到1”的問題。它的算法思想非常簡單直接:“當
某一點曲率與梯度值的乘積大於某一個閾值則認為是角點”。由於“
曲率”和“
梯度"都是可以被解析表示的。
C=
kg=
k(Ix2+
Iy2)21
k=
div(∇I/|∇I|)=IyyI2x−2IxyIxIy+IxxI2y(I2x+I2y)3/2
OpenCV中可以使用Sobel運算可以直接對標梯度計算,故它的實現簡單(篇幅原因這里不貼,下同),從結果上來看,能夠檢測到明顯的角點:
2、Canny方法提出了特征檢測評價標准,它實際上是一種邊緣檢測方法。
可以分為以下5個步驟:1)
應用高斯濾波來平滑圖像,目的是去除噪聲
找尋圖像的強度梯度(intensity gradients);2)
應用非最大抑制(non-maximum suppression)技術來消除邊誤檢;3)
應用雙閾值的方法來決定可能的(潛在的)邊界;4)
利用滯后技術來跟蹤邊界。
它的思路自成一體,非常經典,但是並沒有得到后期算法延續發展;
OpenCV中的實現
將所有的Mat內容轉換為int指針來進行,造成代碼比較晦澀,無法判斷是否符合現代方法。
3、
Harris
當一個窗口在圖像上移動,在平滑區域如圖(a),窗口在各個方向上沒有變化。在邊緣上如圖(b),窗口在邊緣的方向上沒有變化。在角點處如圖(c),窗口在各個方向上具有變化。Harris角點檢測正是利用了這個直觀的物理現象,通過窗口在各個方向上的變化程度,決定是否為角點。
實際計算過程中,通過特征值 λ1 和 λ2 來決定一個窗口是平面、邊緣還是角點:

平面: 該窗口在平坦區域上滑動,窗口內的灰度值基本不會發生變化,所以
值非常小,在水平和豎直方向的變化量均較小,即
和
都較小,那么 λ1 和 λ2 都較小;
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD18Unw=.png)
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1JX3g=.png)
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1JX3k=.png)
邊緣: 值為負數,僅在水平或豎直方向有較大的變化量,即
和
只有一個較大,也就是 λ1>>λ2 或 λ2>>λ1;
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1JX3g=.png)
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1JX3k=.png)
角點: 值很大,在水平、豎直兩個方向上變化均較大的點,即
和
都較大,也就是 λ1 和 λ2 都很大
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1JX3g=.png)
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1JX3k=.png)

我認為Harris方法比較重要 ,因為顯而易見它提出的這種類似卷積的掃描方法在未來的算法中被不斷運用。
4、Shi-Tomasi
Shi-Tomasi 的重要發現是角點的穩定性其實和矩陣 M 的較小特征值有關,於是直接用較小的那個特征值作為分數。這樣就不用調整k值了。
所以 Shi-Tomasi 將分數公式改為如下形式:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1SKz0rbWluKyjOu18xLCvOu18yKStcXA==.png)
以上“角點”算法大多基於圖像的1階導進計算,往往是提出一個函數模型,而后將計算出來的特征值帶入到這個模型中,得出最終定量結果。從Sift開始,引入更有系統的模型和更復雜的描述符。由於特征點識別算法都比較系統和復雜,所以這里我只是將一些個人認為最有價值的知識點一點。
5、SIFT,Distinctive Image Features from Scale-Invariant Keypoints(1999-2004)
SIFT方法是特征點算法的開山之作,它的算法定義和實現比較復雜(甚至比后面出現的算法還要復雜),讓我印象深刻的是這些:
高斯差分金字塔,這種使用方法在未來很多算法中被重復使用。

空間局域最大值搜索,個人認為這是
一種
低效的搜索方法,在未來的算法中比較少見。
6、
SURF,Speeded Up Robust Features(2006-2008)

積分圖像,這種技術不僅在特征點識別領域得到應用,在其他很多領域也是同樣有用。

此外,SURF采用的簡化的濾波運算。這對於特征點識別來說可能是有用的,但是對於濾波來說是不行的。因為BoxFilter將帶來無法避免的顆粒感,這是無法接受的。
SURF算法在很多方面借鑒了SIFT的成功經驗,正是由於它采用了簡化的算子,所以
SURF的抗干擾能力強於SIFT算法、
SURF可以實現並行計算但是S
URF算法的精度略遜於SIFT算法,且
在亮度不變性和視角不變性方面,SURF算法不如SIFT算法。
7、
FAST ,Machine Learning for High-speed Corner Detection(2006-2009)

Fast方法第一次丟棄了上面提出的“
空間局域最大值搜索”,轉而采用二維平面算子的方法進行特征搜索。個人認為這是最大的特點。
8、
STAR,Censure: Center surround extremas for realtime feature detection and matching(2008)
Star特征,也被稱為中心環繞極值(或CenSurE)功能,試圖解決提供哈爾角點或FAST特征的局部化水平的問題,同時還提供尺度不變性。
Star方法使用的是類似五角星的平面算子。在后出現的算法中,Star存在復用的情況。
9、BRIEF(2010)
BRIEF,即二進制魯棒獨立基本特征,是一種相對較新的算法,BRIEF不找到關鍵點;相反,它用於生成可通過任何其他可用的特征檢測器算法定位的關鍵點的描述符。
聽別人說比較適合永遠嵌入式系統,並且它只是一種描述符方法。
10、
BRISK,BRISK: Binary Robust Invariant Scalable Keypoints(2011)
Leutenegger等人介紹的BRISK40描述符,試圖以兩種不同的方式改進Brief。 首先,BRISK引入了自己的一個特征檢測器; 其次,BRISK的特征本身雖然與BRIEF原則相似,卻嘗試以提高整體功能的魯棒性的方式進行二值比較。

它使用金子塔的方式較SIFT/SURF等更為簡單。
11、
ORB: an efficient alternative to SIFT or SURF(2011)
創建了ORB功能[,其目標是為SIFT或SURF提供更高速的替代品。一定需要注意這個算法是真正的開放源代碼,而且提供了不錯的准確率。
12、FREAK 視網膜方法 (2012)
FREAK描述符最初是作為Brief,BRISK和ORB的改進引入的,它是一個生物啟發式的描述符,其功能非常類似於BRIEF,主要在於它計算二進制比較的領域的方式[Alahi12]。
基礎視網膜的特征提取,個人認為優勢不是很明顯。
三、綜合實驗
3.1
數據集
為pascal中取出的6個數據,分別針對特征點提取的6個部分。(
http://www.robots.ox.ac.uk/~vgg/research/affine/)
請注意,這幾個數據集並不是簡單的不同場景的圖像采集,而是各有側重:
1、算法匹配速度比較 ubc
測試方法:在相同的匹配環境下,即使用同樣配置的計算機,對相同的一對圖像進行比較,測試算法的執行時間
2、旋轉變換魯棒性比較 bark
測試方法:對同一圖像進行一定角度的旋轉,旋轉角度逐步遞增,旋轉后的圖像逐一與原始圖像進行匹配,比較能夠正確匹配的特征點對數,並觀察正確匹配對數的變化幅度
3、模糊變換魯棒性比較 bikes
測試方法:對同一圖像用不同的高斯核進行模糊處理,模糊處理后的圖像逐一與原始圖像進
行匹配,比較能夠正確匹配的特征點對數,並觀察正確匹配對數的變化幅度
4、光照變換魯棒性比較 leuven
測試方法:對同一圖像的亮度進行改變,逐
漸降低亮度,改變亮度后的圖像逐一與原始圖像進行匹配,比較能夠正確匹配的特征點對數,並觀察正確匹配對數的變化幅度
5、尺度變換魯棒性比較 bark
測試方法:對原圖像的尺度大小進行改變,尺度變化后的圖像逐一與原始圖像進行匹配,比較能夠正確匹配的特征點對數,並觀察正確匹配對數的變化幅度
6、視角變換魯棒性比較 graf
測試方法:對原場景轉一定角度進行拍攝,不同視角的圖像逐一與原始圖像進行匹配,比較能夠正確匹配的特征點對數,並觀察正確匹配對
3.2 比較方法
綜合考慮實際情況,只選擇SIFT、SURF、BRISK、ORB、FREAK這五種方法進行比較。比較過程中,
依次對各個數據集進行特征點提取並進行兩兩特征點的比較;進一步
對match的結果進行RANSAC提純計算,計算“內點”;
最終結果 =
“內點比例”/
“耗時”
比如對於其中一組圖像:

那么最后,“模型平均”就是最終評價模型在這組圖片上多次運算的平均結果。由於“
內點比例”越高、“耗時”越少,代表匹配地越好,所以最終結果越大越好。
3.3 結果分析
通過折線圖來分析:
其中ORB算法體現出較高模型值。
如果不考慮ORB算法:
則總體差距不是很大。
四、初步小結
1、sift和surf一直提供了較高的准確率,並且結果比較穩定;sift較surf更准一些,但是也有brisk最好的時候;

2、orb的速度非常快,但是最容易出現問題;

3、和”支撐點“算法的比較,角點方法
只能處理自然圖片,不適宜處理輪廓

最終,在解決使用問題的時候,還是建議在以ORB作為基准的基礎上,圍繞具體業務,靈活構建算法。(END)