關於sift算法的理解,前前後後也用了一個月的時間,今天寫下來,希望可以對大家有所幫助。
該算法可以分爲四大步,如圖所示:
複雜程度依次是4顆星,2顆星,3顆星,3顆星。
現在開始
1、construct scale space, 構造尺度空間
1.1 尺度空間在圖像處理中是一個非常有用的概念,可以在維基百科上找到完整定義,簡而言之,他的作用就是模擬一個由近到遠的物體在人眼視網膜上的成像過程。比如,你臉前的電腦屏幕,距離你0.5米,它“看起來”是個屏幕,倘若把他放到100米之外,它“看起來”就是一個“點”了。如下圖:
1.2 圖像尺度空間的定義:原圖像和高斯核做卷積操作
https://img-blog.csdn.net/20130524205728672
其中 正是規範化的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