sift 算法理解

關於sift算法的理解,前前後後也用了一個月的時間,今天寫下來,希望可以對大家有所幫助。

該算法可以分爲四大步,如圖所示:


複雜程度依次是4顆星,2顆星,3顆星,3顆星。


現在開始

1、construct scale space, 構造尺度空間

1.1 尺度空間在圖像處理中是一個非常有用的概念,可以在維基百科上找到完整定義,簡而言之,他的作用就是模擬一個由近到遠的物體在人眼視網膜上的成像過程。比如,你臉前的電腦屏幕,距離你0.5米,它“看起來”是個屏幕,倘若把他放到100米之外,它“看起來”就是一個“點”了。如下圖:


1.2 圖像尺度空間的定義:原圖像和高斯核做卷積操作


•L is a blurred image
•G is the Gaussian Blur operator
•I is an image
•x,y are the location coordinates
•σ is the “scale” parameter. The amount ofblur. Greater the value, greater the blur.
一定要留意這個σ,sift算法從頭到尾,我們都需要這個值,一定要放在腦子裏!
•The *is the convolution operation in x and y. It applies Gaussian blur G onto image I

注意:
–高斯核是唯一一個能產生尺度空間的核。
–尺度是自然存在的,不是人爲創造的。高斯卷積僅僅是種解釋尺度空間的方法。

1.3 我們使用高斯金字塔來描述尺度空間

解釋:
1、一大摞那個東西叫做一個octave(翻譯爲“組”), 每個octave由若干個interval(翻譯爲“層”)組成。
2、層之間做的是高斯平滑操作,傳到下一個組的時候,做的是降採樣操作。其實就是傳統金字塔加上高斯平滑操作。
3、用每組的倒數第三層,降採樣,生成下一組的第一層。
4、金字塔要從下往上看!從下往上看!從下往上看!說三遍!

1.4

高斯金字塔屬性:
1、每組生成s+3個層,如上圖,生成5層,則s=2;
2、組內,相鄰兩層的尺度空間關係是k倍,k= 21/s   , 例子中,k= 21/2   .
3、每組的相同位置的層,尺度空間關係是2倍。

1.5至此,建造完尺度空間,生成了什麼鬼?給出一個動態的例子,一目瞭然。

https://img-blog.csdn.net/20130524205728672



1.6 但是到這,還沒完,sift的創造者想出來一個驚天地泣鬼神的方法,如下:


其中 正是規範化的LoG算子。

所以我們引進了一種改進的方法:DoG(Difference of Gaussian) 漢文名字:高斯差

1.7 DoG 函數



對應的,我們要創建DoG 金字塔,如上圖右側, 具體操作就是用高斯金字塔相鄰兩層做減操作生成一個DoG的層,就是上圖兩個黃片相減 生成一個綠片,

最終就成如下圖


2、Key point localization 關鍵點定位

現在,我們已經得到了DoG 金字塔,就可以進行關鍵點定位了,關鍵點定位操作是基於DoG金字塔的。

2.1 關鍵點有三個屬性:尺度、座標、方向


解釋:

1)以x爲例, 和周圍的26個鄰居點作比較,如果它最大或者最小,那麼就是關鍵點

2)一組內的最上和最下層的點,由於缺少比較對象,就忽略了。

2.2 一旦關鍵點全部被找到之後,進一步處理,去掉一些“長的醜的”的關鍵點

1)去除對比度的關鍵點

2)去除邊緣響應強的關鍵點


完成這步之後,圖像上關鍵點如圖:



3、Assign Key point Orientation 給關鍵點分配方向

3.1 選取關鍵點鄰近區域,對該區域內所有像素點求取梯度大小和梯度方向,區域面積大小爲關鍵點所在尺度空間值的3倍大小,即3σ,梯度大小和梯度方向公式如下:

3.2 做統計操作

用36個柱(每個柱大小就是10度)的梯度直方圖統計這些像素點。統計的時候 梯度大小要按照高斯分佈進行累加,就是說,距離關鍵點越近的點,貢獻值越大。最後得到的直方圖就是在某一方向,該區域內所有像素點貢獻出的梯度大小之和。

直方圖峯值代表了主方向,對於大於峯值80% 的“次峯值”,我們也保留,當做第二主方向,所以說,關鍵點可能有多個方向, 如右下圖。


現在,我們已經得到了關鍵的三個屬性值了,尺度(scale),位置(x,y), 方向(direction),距離成功很近了。


4、build Keypoint descriptor 構建關鍵點描述子

這一步的想法可以參考第三步。

簡單來說,就是選擇關鍵點附近 的區域,然後分割成4*4的小區域。每個小區域的面積大小和確定關鍵點主方向選的面積大小一樣。用8個柱(每個柱45度)來統計每個小區域的梯度信息,這樣的話,總共就是4*4*8個柱,用向量表示這128個柱,sift就至此結束。實際情況稍微複雜一些。如下:

4.1 區域面積的選擇

考慮到三線性插值和旋轉,實際選擇區域面積較大。

4.2 旋轉區域到主方向,主方向在第三步求出



4.3 統計像素的梯度大小和梯度方向,同樣高斯模值用高斯分佈加成。


4.4 用一組128維的向量把上右圖表示出來。

4.5 接近尾聲的時候,再來兩個處理。第一,對這個128維的向量進行歸一化處理,這樣解決了光照的問題。第二,設置門限值,再一次歸一化處理,解決非線性關照,相機飽和度變化造成默寫方向梯度值過大問題。

至此,sift算法結束,接下來的工作就是如何盡情玩 苦苦生成的128維向量了!


後記:

sift算法不是很難,就是比較瑣碎,

這是我用英文寫的一個關於sift算法的PPT

http://download.csdn.net/detail/u010807846/9243001

另外網上牛人很多,下面我把當時自己學習用到的連接放到下面,希望對你幫助

http://www.360doc.com/content/14/1013/15/18306241_416576994.shtml#(推薦)

http://www.fx114.net/qa-211-83116.aspx(推薦)

http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html(推薦)

http://blog.csdn.net/zd0303/article/details/8365680

http://www.zhizhihu.com/html/y2010/2146.html

http://blog.csdn.net/xiaowei_cqu/article/details/8069548

http://www.fx114.net/qa-73-284482.aspx

http://blog.csdn.net/v_JULY_v/article/details/6186942

有問題直接放評論就可以了

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