0、特征與匹配方法總結匯總對比
參考網址:http://simtalk.cn/2017/08/18/%E7%89%B9%E5%BE%81%E4%B8%8E%E5%8C%B9%E9%85%8D/#ORB
(1)ORB:ORB特點就是計算速度快、節約了存儲空間,但是它算法的質量較差而且沒有解決尺度一致性問題
(2) Harris:具有平移不變,旋轉不變,能克服一定光照變化的特質。
缺點:該算法不具有尺度不變性;該算法提取的角點是像素級的;該算法檢測時間不是很令人滿意。
(3) SIFT尺度不變特征變換匹配:
1.SIFT特征是圖像的局部特征,優勢在於尺度變換、平移變換和旋轉變換的不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性;
2. 獨特性(Distinctiveness)好,信息量豐富,適用於在海量特征數據庫中進行快速、准確的匹配;
3. 多量性,即使少數的幾個物體也可以產生大量的SIFT特征向量;
4. 高速性,經優化的SIFT匹配算法甚至可以達到實時的要求;
5. 可擴展性,可以很方便的與其他形式的特征向量進行聯合。
缺點:SIFT只利用了灰度性質算法,忽略了色彩信息。
(4)SURF(加速魯棒特征)的主要特點是快速性,同時具有尺度不變性,對光照變化和仿射、透視變化也具有較強的魯棒性。
缺點:在求主方向階段太依賴局部區域像素的梯度方向,有可能使得找到的主方向不准確。另外圖像金字塔層取的不足夠緊密也會使得尺度有誤差。
(5) LBP具有灰度不變性和旋轉不變性的特點,但是其只適用於均勻變化的光照圖像中,光照的變化會降低圖像分析的正確性。同時其破壞了方向性,具有一定的誤差。
1、SIFT
參考文獻:https://blog.csdn.net/chuhang_zhqr/article/details/50890546
原理:在前面兩節我們學習了一些角點檢測技術,比如Harris 等。它們具有旋轉不變特性,即使圖片發生了旋轉,我們也能找到同樣的角點。很明顯即使圖像發生旋轉之后角點還是角點。那如果我們對圖像進行縮放呢?角點可能就不再是角點了。以下圖為例,在一副小圖中使用一個小的窗口可以檢測到一個角點,但是如果圖像被放大,再使用同樣的窗口就檢測不到角點了。所以在2004 年,D.Lowe 提出了一個新的算法:尺度不變特征變換(SIFT),這個算法可以幫助我們提取圖像中的關鍵點並計算它們的描述符。SIFT 算法主要由四步構成。我們來逐步進行學習。
SIFT優勢在於:尺度變換、平移變換和旋轉變換的不變性
算法步驟:
-
使用DoG(Difference of Gaussian,高斯差分算子)在不同的尺度空間上找到特征點
- DoG特征就是在不同參數下的高斯濾波(卷積操作)結果相減
-
對得到的特征點進行穩定度檢測,得到特征點的尺度和位置
-
計算圖像的梯度圖,確定特征點的方向
- 使用圖像的局部梯度作為特征點的描述子,最終構成SIFT特征向量
尺度空間極值檢測:從上圖我們可以很明顯的看出來在不同的尺度空間不能使用相同的窗口檢測極值點。對小的角點要用小的窗口,對大的角點只能使用大的窗口。為了達到這個目的我們要使用尺度空間濾波器。(尺度空間濾波器可以使用一些列具有不同方差_ 的高斯卷積核構成)。使用具有不同方差值_ 的高斯拉普拉斯算子(LoG)對圖像進行卷積,LoG 由於具有不同的方差值_ 所以可以用來檢測不同大小的斑點(當LoG 的方差_ 與斑點直徑相等時能夠使斑點完全平滑)。簡單來說方差_ 就是一個尺度變換因子。例如,上圖中使用一個小方差_ 的高斯卷積核是可以很好的檢測出小的角點,而使用大方差_ 的高斯卷積核時可以很好的檢測除大的角點。所以我們可以在尺度空間和二維平面中檢測到局部最大值,如(x,y,), 這表示在 尺度中(x,y)點可能是一個關鍵點。(高斯方差的大小與窗口的大小存在一個倍數關系:窗口大小等於6 倍方差加1,所以方差的大小也決定了窗口大小)但是這個LoG 的計算量非常大,所以SIFT 算法使用高斯差分算子(DoG)來對LoG 做近似。這里需要再解釋一下圖像金字塔,我們可以通過減少采樣(如只取奇數行或奇數列)來構成一組圖像尺寸(1,0.5,0.25 等)不同的金字塔,然后對這一組圖像中的每一張圖像使用具有不同方差_ 的高斯卷積核構建出具有不同分辨率的圖像金字塔(不同的尺度空間)。DoG 就是這組具有不同分辨率的圖像金字塔中相鄰的兩層之間的差值。
在DoG 搞定之后,就可以在不同的尺度空間和2D 平面中搜索局部最大值了。對於圖像中的一個像素點而言,它需要與自己周圍的8 鄰域,以及尺度空間中上下兩層中的相鄰的18(2x9)個點相比。如果是局部最大值,它就可能是一個關鍵點。基本上來說關鍵點是圖像在相應尺度空間中的最好代表。如下圖所示:
該算法的作者在文章中給出了SIFT 參數的經驗值:octaves=4(通過降低采樣從而減小圖像尺寸,構成尺寸減小的圖像金字塔(4 層)?),尺度空間為5,也就是每個尺寸使用5 個不同方差的高斯核進行卷積,初始方差是1.6,k 等於p2 等。
關鍵點(極值點)定位:一旦找到關鍵點,我們就要對它們進行修正從而得到更准確的結果。作者使用尺度空間的泰勒級數展開來獲得極值的准確位置,如果極值點的灰度值小於閾值(0.03)就會被忽略掉。在OpenCV 中這種閾值被稱為contrastThreshold。DoG 算法對邊界非常敏感,所以我們必須要把邊界去除。前面我們講的Harris 算法除了可以用於角點檢測之外還可以用於檢測邊界。作者就是使用了同樣的思路。作者使用2x2 的Hessian 矩陣計算主曲率。從Harris 角點檢測的算法中,我們知道當一個特征值遠遠大於另外一個特征值時檢測到的是邊界。所以他們使用了一個簡單的函數,如果比例高於閾值(OpenCV 中稱為邊界閾值),這個關鍵點就會被忽略。文章中給出的邊界閾值為10。所以低對比度的關鍵點和邊界關鍵點都會被去除掉,剩下的就是我們感興趣的關鍵點了。
為關鍵點(極值點)指定方向參數:現在我們要為每一個關鍵點賦予一個反向參數,這樣它才會具有旋轉不變性。獲取關鍵點(所在尺度空間)的鄰域,然后計算這個區域的梯度級和方向。根據計算得到的結果創建一個含有36 個bins(每10 度一個bin)的方向直方圖。(使用當前尺度空間_ 值的1.5 倍為方差的圓形高斯窗口和梯度級做權重)。直方圖中的峰值為主方向參數,如果其他的任何柱子的高度高於峰值的80% 被認為是輔方向。這就會在相同的尺度空間相同的位置構建除具有不同方向的關鍵點。這對於匹配的穩定性會有所幫助。
關鍵點描述符:新的關鍵點描述符被創建了。選取與關鍵點周圍一個16x16 的鄰域,把它分成16 個4x4 的小方塊,為每個小方塊創建一個具有8 個bin 的方向直方圖。總共加起來有128 個bin。由此組成長為128 的向量就構成了關鍵點描述符。除此之外還要進行幾個測量以達到對光照變化,旋轉等的穩定性。
關鍵點匹配:下一步就可以采用關鍵點特征向量的歐式距離來作為兩幅圖像中關鍵點的相似性判定度量。取第一個圖的某個關鍵點,通過遍歷找到第二幅圖像中的距離最近的那個關鍵點。但有些情況下,第二個距離最近的關鍵點與第一個距離最近的關鍵點靠的太近。這可能是由於噪聲等引起的。此時要計算最近距離與第二近距離的比值。如果比值大於0.8,就忽略掉。這會去除90% 的錯誤匹配,同時只去除5% 的正確匹配。如文章所說。這就是SIFT 算法的摘要。非常推薦你閱讀原始文獻,這會加深你對算法的理解。請記住這個算法是受專利保護的。所以這個算法包含在OpenCV 中的收費模塊中。
2、SURF
在 上 一 節 中 我 們 學 習 了 使 用 SIFT 算 法 進 行 關 鍵 點 檢 測 和 描 述。 但是 這 種 算 法 的 執 行 速 度 比 較 慢, 人 們 需 要 速 度 更 快 的 算 法。 在 2006 年Bay,H.,Tuytelaars,T. 和 Van Gool,L 共同提出了 SURF(加速穩健特征)算法。跟它的名字一樣,這是個算法是加速版的 SIFT。在 SIFT 中, Lowe 在構建尺度空間時使用 DoG 對 LoG 進行近似。 SURF使用盒子濾波器(box_filter)對 LoG 進行近似。下圖顯示了這種近似。在進行卷積計算時可以利用積分圖像(積分圖像的一大特點是:計算圖像中某個窗口內所有像素和時,計算量的大小與窗口大小無關),是盒子濾波器的一大優點。而且這種計算可以在不同尺度空間同時進行。同樣 SURF 算法計算關鍵點的尺度和位置是也是依賴與 Hessian 矩陣行列式的。
為了保證特征矢量具有選裝不變形,需要對於每一個特征點分配一個主要方向。需要以特征點為中心,以 6s(s 為特征點的尺度)為半徑的圓形區域內,對圖像進行 Harr 小波相應運算。這樣做實際就是對圖像進行梯度運算,但是利用積分圖像,可以提高計算圖像梯度的效率,為了求取主方向值,需喲啊設計一個以方向為中心,張角為 60 度的扇形滑動窗口,以步長為 0.2 弧度左右旋轉這個滑動窗口,並對窗口內的圖像 Haar 小波的響應值進行累加。主方向為最大的 Haar 響應累加值對應的方向。在很多應用中根本就不需要旋轉不變性,所以沒有必要確定它們的方向,如果不計算方向的話,又可以使算法提速。SURF 提供了成為 U-SURF 的功能,它具有更快的速度,同時保持了對 +/-15 度旋轉的穩定性。OpenCV 對這兩種模式同樣支持,只需要對參數upright 進行設置,當 upright 為 0 時計算方向,為 1 時不計算方向,同時速度更快。
生成特征點的特征矢量需要計算圖像的 Haar 小波響應。在一個矩形的區域內,以特征點為中心,沿主方向將 20s*20s 的圖像划分成 4*4 個子塊,每個子塊利用尺寸 2s 的 Haar 小波模版進行響應計算,然后對響應值進行統計,組成向量 v = ( d x , d y , |d x |, |d y |)。這樣每個子區域攜帶4個信息,共有16個子區域,共64維。最后為了防止光照與對比度的影響,對特征矢量歸一化處理。這個描述符的長度為 64。降低的維度可以加速計算和匹配,但又能提供更容易區分的特征。為了增加特征點的獨特性,SURF 還提供了一個加強版 128 維的特征描述符。當 d y 大於 0 和小於 0 時分別對 d x 和 |d x | 的和進行計算,計算 d y和 |d y | 時也進行區分,這樣獲得特征就會加倍,但又不會增加計算的復雜度。
OpenCV 同樣提供了這種功能,當參數 extended 設置為 1 時為 128 維,當參數為 0 時為 64 維,默認情況為 128 維。
在檢測特征點的過程中計算了 Hessian 矩陣的行列式,與此同時,計算得到了 Hessian 矩陣的跡,矩陣的跡為對角元素之和。按照亮度的不同,可以將特征點分為兩種,第一種為特征點跡其周圍小鄰域的亮度比背景區域要亮,Hessian 矩陣的跡為正;另外一種為特征點跡其周圍小鄰域的亮度比背景區域要暗,Hessian 矩陣為負值。根據這個特性,首先對兩個特征點的 Hessian 的跡進行比較。如果同號,說明兩個特征點具有相同的對比度;如果異號的話,說明兩個特征點的對比度不同,放棄特征點之間的后續的相似性度量。對於兩個特征點描述子的相似性度量,我們采用歐式距離進行計算。簡單來說 SURF 算法采用了很多方法來對每一步進行優化從而提高速度。分析顯示在結果效果相當的情況下 SURF 的速度是 SIFT 的 3 倍。SURF 善於處理具有模糊和旋轉的圖像,但是不善於處理視角變化和關照變化。
3、區別
高斯金字塔是對原圖像的尺寸是在不斷變化的,高斯模板尺寸不變。每一層的建立必須等到上一層構造完畢后才能進行處理,依賴性很強,這樣造成速度上很慢。SURF構建尺度金字塔的方法采用原圖像大小不變,變化的是模板大小,即采用變化的模板盒子尺寸對原圖像進行濾波,構造出尺度空間。同時,SURF可以采用並行運算,對金字塔中的每層圖像同時進行處理。通過逐漸增大的盒子尺寸濾波模板與積分圖像卷積產生的Hessian矩陣行列式的響應圖像,構造出金字塔。