圖像特徵點匹配,SIFT及SURF算法的原理及儘量拋開數學問題的淺析(含示例程序,基於VS2013,OpenCV_2.49)

在介紹算法前我們首先放一張效果圖來看一看(SURF算法的使用效果),同時這篇文章我們更多的是要講清楚原理,並不關心具體的數學推導和意義所在,所以文中儘可能省略整個算法中的數學部分,可以作爲算法入門的一個簡單教程

這裏我們感謝淺墨的示例程序,在他的博客中對於SURF算法的使用給了比較詳細的說明以及介紹,原文博客

同時也附上程序的源文件(基於VS2013+OpenCV_2.49),源程序下載


在開始正題之前,首先還是要感謝前輩大牛的啓發,本文主要參考瞭如下四篇博客(最後一篇主要是說SIFT和SURF算法的區別),再次拜謝大牛們:

https://www.cnblogs.com/wangguchangqing/p/4853263.html
https://blog.csdn.net/weixin_38404120/article/details/73740612
https://blog.csdn.net/zddblog/article/details/7521424

https://blog.csdn.net/Blateyang/article/details/76512398

       這裏我們主要以SIFT算法的原理來進行說明,因爲SIFT和SURF的算法比較相似,主要區別在於算法的效率上,具體可以參考上述文獻的最後一篇

      好了,接下來我們步入正題,介紹一下特徵點匹配的原理:

      在開始之前,我們首先介紹一下SIFT算法的大致步驟,以便讀者可以在閱讀完一段後參考我們這一段主要是趕了什麼,實現了怎樣的需求:


問題1:兩張照片之所以能匹配得上,是因爲其特徵點的相似度較高

這個原理其實不難理解,我們在分析兩個物體是否匹配的話首先我們要看這兩個物體有沒有相同的特徵,而在看的過程中我們需要換個角度或者換個距離查看以保證我們觀測的準確,下面這個圖就是一個生動的說明:


     在一定的範圍內,無論物體是大還是小,人眼都可以分辨出來。然而計算機要有相同的能力卻不是那麼的容易,在未知的場景中,計算機視覺並不能提供物體的尺度大小,其中的一種方法是把物體不同尺度下的圖像都提供給機器,讓機器能夠對物體在不同的尺度下有一個統一的認知。在建立統一認知的過程中,要考慮的就是在圖像在不同的尺度下都存在的特徵點。

引出概念1:尺度空間

   平時生活中,用人眼去看一張照片時,隨着觀測距離的增加,圖像會逐漸變得模糊。那麼計算機在“看”一張照片時,會從不同的“尺度”去觀測照片,尺度越大,圖像越模糊。

   那麼這裏的尺度”就是二維高斯函數當中的σ值,一張照片與二維高斯函數卷積後得到很多張不同σ值的高斯圖像,這就好比你用人眼從不同距離去觀測那張照片。所有不同尺度下的圖像,構成單個原始圖像的尺度空間圖像尺度空間表達”就是圖像在所有尺度下的描述。

引出概念2:高斯卷積

      這裏的高斯卷積更多的是一種獲取不同模糊度的工具,因爲高斯核是唯一可以產生多尺度空間的核。

     下圖爲高斯函數在數學座標系下的圖像以及對應的高斯核圖像,我們可以看出,經過高斯處理後,中心點的關聯性最大,越靠近邊緣關聯性越小,這樣的處理也就產生了“模糊”的效果


不同高斯函數參數下的圖片處理效果:


引出概念3:分離的高斯卷積

     在運算過程中,我們使用的高斯核通常是如下圖右圖所示的方形核,但是這樣做會導致運算量大,圖像處理速度低,而爲了解決這一問題,我們常常採用分離的高斯卷積,具體如左圖所示


問題2:爲什麼要提到高斯模糊與“尺度空間表達”,它們有什麼關係呢?

     “尺度空間表達”指的是不同高斯核所平滑後的圖片的不同表達,意思就是:原始照片的分辨率,和經過不同高斯核平滑後的照片的分辨率是一樣的。但是,對於計算機來說,不同模糊程度,照片“看”上去的樣子就不一樣了。高斯核越大,圖片“看”上去就越模糊。

問題3:圖片的模糊與找特徵點有關係嗎?

      計算機沒有主觀意識去識別哪裏是特徵點,它能做的,只是分辨出變化率最快的點。彩色圖是三通道的,不好檢測突變點。需要將RGB圖轉換爲灰度圖,此時灰度圖爲單通道,灰度值在0~255之間分佈。

   無論人眼觀測照片的距離有多遠,只要能辨認出物體關鍵的輪廓特徵,那就可以大致知道圖像所表達的信息。計算機也一樣,高斯卷積之後,圖像雖然變模糊了。但是整體的像素沒有變,依然可以找到灰度值突變的點。

    而這些點,就可以作爲候選特徵點了,後期再進一步減少點的數量,提高準確率即可。

問題4:除了高斯模糊外,我們還有沒有什麼方法可以實現不同的尺度空間變換呢?

可以使用圖像金字塔

引出概念4:圖像金字塔

圖像的金字塔模型是指,將原始圖像不斷降階採樣,得到一系列大小不一的圖像,由大到小,從下到上構成的塔狀模型。下圖就是圖像金字塔的示例圖片,最左側是抽樣示意圖,中間是向下採樣(我們稱之爲高斯金字塔),最左側是向上採樣(我們稱之爲拉普拉斯金字塔)


好了,有了上文所述的圖像金字塔概念以及高斯模糊概念之後我們就可以進行特徵匹配中的第一步了

步驟一:使用高斯金字塔完成尺度空間的極值檢測

方法1(LOG圖像):那麼將圖像金字塔和高斯模糊結合起來的話,就得到了LOG圖像(高斯拉普拉斯變換圖像)。其步驟是:先將照片降採樣,得到了不同分辨率下的圖像金字塔。再對每層圖像進行高斯卷積。這樣一來,原本的圖像金字塔每層只有一張圖像,而卷積後,每層又增加了多張不同模糊程度下的照片。


方法2(DOG圖像):DOG即高斯差分。構造高斯差分圖像的步驟是:在獲得LOG圖像後,用其相鄰的圖像進行相減,得到所有圖像重新構造的金字塔就是DOG金字塔。


無論採用哪種方法我們的目的都是要獲得圖像中的極值點,採用的方法是每個像素點與其周圍的像素點比較,當其大於或者小於所有相鄰點時,即爲極值點。

比如說,如下圖所示,以黃點爲檢測點,那麼其周圍的點,除了同層所包圍的8個綠點外,還有上一層的9個點與下一層的9個點。


問題5:DOG運算和LOG運算相比有什麼不同?優勢在哪裏?

DOG的運算量比LOG少很多,可以降低內存佔用率,加快圖片處理速度。

完成了尺度空間的極值檢測後我們就可以進入算法的第二步,關鍵點的定位

步驟二:關鍵點的定位

在步驟二中我們主要需要完成兩個事情:極值點的精確定位和去除邊緣的影響

首先是精確定位:

我們找的的極值點是在高斯差分之後所確定下來的,那麼其是屬於離散空間上的點,不一定是真正意義上的極值點。

我們需用用到一條曲線來進行擬合。這樣就完成了極值點的精確定位。



其次是去除邊緣影響:

到這一步,得到的極值點是比較精確了,但不夠準確。有些極值點不是我們想要的,當中就有一大部分是邊緣區域產生的極值點。因爲物體的邊緣輪廓在灰度圖中,存在着灰度值的突變,這樣的點在計算中就被“誤以爲”是特徵值。

仔細分析,邊緣區域在縱向上灰度值突變很大,但是橫向上的變化就很小了。好比你用黑筆在白紙上水平畫一條線段。垂直方向看,黑色線與白色區域的突變很大。但是水平方向看時,黑色線上某一點的水平臨近點仍然是黑點,突變程度非常小。具體可參見Harris角點檢測算法。這裏附一個寫的很好的Blog。

到這一步我們已經找到了圖像中的極值點,但是我們需要進行圖像匹配的話還需要知道這些極值點的方向,這就進入了我們的第三步

步驟三:方向的確定

經過Harris角點檢測算法之後,基本上得到了我們想要的精確特徵點了。接下來我們就要求它們的方向。

DOG 金字塔中,有很多層高斯模糊後的圖像。在此,我們對其中一張圖像的處理進行說明。當我們精確定位關鍵點後,需要找到該特徵點對應的尺度值σ,根據這一尺度值,將對應的高斯圖像的關鍵點進行有限差分,以3×1.5σ爲半徑的區域內圖像梯度的幅角幅值然後利用直方圖統計領域內像素對應的梯度和幅值:梯度方向角爲橫軸刻度,取45度爲一個單位,那麼橫軸就有8個刻度;縱軸是對應梯度的幅值累加值。取幅值最高的方向爲主方向。有的時候,會出現第二峯值,因爲有較多的關鍵點是多方向的。如果直接把它忽略掉不加以考慮的話,最後對匹配精度的影響還是蠻大的。所以,爲了匹配的穩定性,我們將超過峯值能量的百分之80的方向,稱爲輔方向。

具體我們可以用這樣一張圖來表示,左圖是我們找到的各個像素的方向,右圖是我們使用直方圖統計出各個方向的像素所佔的比例

完成步驟三之後我們可以得到這樣一組對比圖:


最後就是完成關鍵點的描述

步驟四:關鍵點的描述

這裏如果具體細分一般可以分爲7步:確定描述子所需要的圖像區域、將座標軸轉換爲關鍵點的方向、將子區域內的梯度值分配到八個方向上,計算其權重值、差值計算每個種子點八個方向的梯度、歸一化處理、描述子向量門限、按特徵點的尺度對特徵描述向量進行排序。

因爲這篇文章想大家儘可能的瞭解整個算法的流程,撇開復雜的數學內容,所以這裏只簡單的介紹如下幾點:

1、確定描述子所需要的圖像區域

特徵描述子與特徵點所在的尺度有關,因此,對梯度的求取應在特徵點對應的高斯圖像上進行。將關鍵點附近的鄰域劃分爲d*d(Lowe建議d=4)個子區域,每個子區域做爲一個種子點,每個種子點有8個方向。如下圖所示


2、將座標軸轉換爲關鍵點的方向

這裏不做過多的解釋說明,放兩張圖大家就明白了,注意:第二幅圖的關鍵點周邊像素的方向,有助於讀者理解



3、將子區域內的梯度值分配到八個方向上,計算其權重值

在每子區域內計算8個方向的梯度方向直方圖,繪製每個梯度方向的累加值,形成一個種子點。與求特徵點主方向時有所不同,此時,每個子區域的梯度方向直方圖將0°~360°劃分爲8個方向範圍,每個範圍爲45°,這樣,每個種子點共有8個方向的梯度強度信息。由於存在4X4Bp X Bp)個子區域,所以,共有4X4X8=128個數據,最終形成128維的SIFT特徵矢量。同樣,對於特徵矢量需要進行高斯加權處理,加權採用方差爲mσBp/2的標準高斯函數,其中距離爲各點相對於特徵點的距離。使用高斯權重的是爲了防止位置微小的變化給特徵向量帶來很大的改變,並且給遠離特徵點的點賦予較小的權重,以防止錯誤的匹配。



 在最後,對特徵向量進行歸一化等處理,去除光照變化的影響,這裏更多的是數學方法,這裏不再過多的介紹

到這裏SIFI及SURF算法的特徵點匹配就基本完成了。


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