SIFT核心步驟【核心要點】通俗易懂,適合小白

本人目前研一小小白哈,老師是搞圖像的,給我的任務是硬件部分的,選了一門圖像工程的課,初學SIFT算子,來吐個槽哈。

表示不貼代碼,只論核心步驟,並向你扔了一坨翔。。。。。。。。哈哈。

 

1、SIFT算子的作用

尺度不變特徵轉換即SIFT (Scale-invariant feature transform)是一種計算機視覺的算法。它用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變量,此算法由 David Lowe在1999年所發表,2004年完善總結。
局部影像特徵的描述與偵測可以幫助辨識物體,SIFT特徵是基於物體上的一些局部外觀的興趣點而與影像的大小和旋轉無關。對於光線、噪聲、些微視角改變的容忍度也相當高。基於這些特性,它們是高度顯著而且相對容易擷取,在母數龐大的特徵數據庫中,很容易辨識物體而且鮮有誤認。使用 SIFT特徵描述對於部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特徵就足以計算出位置與方位。在現今的電腦硬件速度下和小型的特徵數據庫條件下,辨識速度可接近即時運算。SIFT特徵的信息量大,適合在海量數據庫中快速準確匹配。
 SIFT算法的實質是在不同的尺度空間上查找關鍵點(特徵點),並計算出關鍵點的方向。SIFT所查找到的關鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等。

 

上邊這一段百度上粘過來的哈,自己總結不了這麼詳細哈,下面說一下我自己的理解,SIFT算子就是搞特徵點檢測的,大多就是角點嗎,目的就是爲了能將你感興趣的部分,用幾個點 “代表” 一下,下一次再碰到類似的區塊的時候,把能代表這些區塊的 "點" 也找出來,兩家匹配一下,匹配的上就說明,,,,,說明不了啥,就是配上了,哈哈。

 

2、SIFT算子的核心步驟,簡要心法

步驟一:建立尺度空間,即建立圖像金字塔,一般是高斯差分金子塔(DOG)。

步驟二:在尺度空間中檢測極值點,也就是特徵點。

步驟三:特徵點方向賦值,完成此步驟後,每個特徵點有三個主要信息:位置 尺度 方向 

步驟四:計算特徵點的描述子。

 

3、核心步驟講解

3.1 建立尺度空間

圖1

先從一維的尺度空間說哈,如圖1所示,h所代表的就是尺度空間呢,類似於我們常說的分辨率,h越大分辨率越低,所能夠看到的信息就越少。那二維的圖像也類似呢。如圖2。

圖2

看這隻喵,每兩個 ”採樣“ 像素點之間相隔的尺度越大,所能得到的 “有效” 像素點就越少,那這張圖像中的信息就越少,所以圖像就變小了呀,摞一塊,小的在上邊,大的在下邊,初步金字塔就出來了。如圖4。

圖4

不過呢,這只是初步,離真正的金字塔還差點呢,這金子塔每層只有一張圖像,蘊含的信息實在有點少了,我們SIFT算子找角點的主要思想就是,在任何情況下,無論圖像有多模糊,特徵點的值是不會變的,該有的總會有的。所以此時我們這裏每層只有一張圖像,怎麼能夠代表這一層呢,最起碼需要每層要再多來幾張圖求個平均值呀,因此前輩們就在每一層圖像的基礎上,又利用高斯模糊生成基礎圖像的衍生圖像。如圖5。

圖5

以圖4的第一層爲例,再衍生出來幾張圖像如圖5,至於高斯模糊(高斯平滑)的算子解釋自行百度,都寫上,這博客長的滾輪都拉壞了,我的理解就是一個低通濾波器,平滑過頭了就是模糊了,比均值濾波好一點。有了這些圖像我們的金字塔纔算正式形成了。如圖6所示。

圖6

總結一下來說高斯金字塔的建立分爲三步:

1、對圖像做高斯平滑(高斯模糊)

2、對每張圖像做下采樣(包括原圖)

3、摞一塊。

高斯金字塔建立完成,步驟一完成。

 

3.2 尺度空間中檢測特徵點

要想檢測特徵點,我們就需要利用我們手裏現在最有用的數據-----高斯金字塔了,咋用嘞,前輩們又說話了,僅有一個高斯金字塔是遠遠不夠滴,我們還要進一步生成一個DOG金字塔(高斯差分圖像金字塔),用來觀察每一層金子塔中,是否在無論多麼模糊的情況下,都會有那麼幾個老不死的不願意離開,賴在了圖像上,那麼特徵點就是他們了,可咋找呢,前輩們又總結了,將高斯金字塔中每一層中的圖像兩兩相減,DOG金字塔就出來了,可爲啥是減法呢,爲啥不是除法,比較之類的呢? 跑去問前輩,懟回來一句:just do it ,扯個淡哈,金字塔生成如下圖7所示。

圖7

嘿,快出來了哈,加油,奶一口,繼續。

這兩兩的差分圖像出來了,可每張圖像上仍然留下有好多點,哪幾個纔是最特殊的那個呢,這些點咋找嘞,白鬍子老頭又說話了,將這剩下的像素點跟它自身相鄰的所有像素點比較,包括本層和上下兩層的一共有26個點需要比較,如果他是這26個點中最小的那一個,那麼它就是那個特徵點了。如下圖8

圖8

到這裏,特徵點就被我們找出來了,這些點就能夠代表這其中某張圖了呀,但只能代表本層的哈,比如上邊那個喵,圖2,你在比較大的喵裏找到的特徵點,只能代表那隻大喵,mini版的你代表不了,因爲數據源都不一樣。

特徵點找到了,嘿嘿,可你怎麼和另外的特徵點匹配呢?這就是我們接下來的工作了,特徵點的描述,噴口血,不是說快完了嗎,小哥想睡覺呀,唉,爲了以後有點故事追小姐姐,堅持,繼續!

 

3.3 特徵點主方向確定

我們的特徵點找到了,但是爲了讓這些特徵點的描述子具有旋轉不變性,需要利用圖像的局部特徵爲給每一個特徵點分配一個基準方向。以便於以後進行特徵點匹配的時候,不用再去旋轉圖像了呀,因爲方向都是自己的主方向嗎,直接拿來就匹。

我們在這裏使用圖像梯度直方圖的方法來爲每個圖像分配一個主方向,公式如下。只求理解的化,公式就不背了,反正我也是隨用隨查。

圖9

圖10

在完成關鍵點及其鄰域的梯度計算後,使用直方圖統計該特徵點鄰域內像素梯度的幅值和方向(一般是16x16的鄰域)。梯度直方圖將0~360度的方向範圍分爲36個柱(bins),其中每柱10度。如圖10所示,直方圖的峯值方向(最高的那一個)代表了關鍵點的主方向,(爲簡化,圖中只畫了八個方向的直方圖)。

至此我們的主方向也選出來了,還差最後一步,描述子的生成,頭懸樑,繼續,要不明天就忘了。。。。

 

3.4 描述子的生成

在上邊我們計算過了每個特徵點鄰域的梯度,不要丟掉呀,還沒用完呢,快撿起來繼續用,對於每一個特徵點,擁有三個信息:位置、尺度以及方向。接下來就是爲每個特徵點建立一個描述符,使其不隨各種變化而改變,比如光照變化、視角變化等等。並且描述符應該有較高的獨特性,以便於提高特徵點正確匹配的概率。

圖11

如上圖11,將關鍵點附近的區域劃分爲d*d(Lowe建議d=4)個子區域,每個子區域作爲一個種子點,每個種子點有8個方向。而每個特徵點的描述子由4個種子點構成。

別跑!描述子雖然生成了,但是還要旋轉不變呢呀,要不你咋和別人的描述子進行配呢,接下來就是將座標軸旋轉到主方向上,重新生成一下特徵點座標信息,OK,大功告成。

圖12

最後,看看SIFT到底幫我們得到了什麼?其實就兩樣東西,一個特徵點(尺度,位置,方向),一個特徵點的描述子。

這就是SIFT的作用了,感謝所有在寫博客的人,包括我自己,嘿嘿,幫助我理解了那枯燥的論文,課本。

本文僅用於入門哈,好多細節我都直接忽略了,爲的就是,先懂,再學,道可頓悟,術需漸修。

感謝一下幾位博主哈,寫的比我深刻多了,還有各種公式表格,想看的拿走哈

https://blog.csdn.net/lyl771857509/article/details/79675137

https://blog.csdn.net/u010440456/article/details/81483145

https://www.cnblogs.com/Alliswell-WP/p/SIFT.html

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