SIFT特征提取分析


SIFT特征提取分析

讀‘D. G. Lowe. Distinctive Image Features from Scale-Invariant Keypoints[J],IJCV,2004’ 筆記

關鍵點是指圖像中或者視覺領域中明顯區別於其周圍區域的地方,這些關鍵點對於光照,視角相對魯棒,所以對圖像關鍵點提取特征的好壞直接影響后續分類、識別的精度。

特征描述子就是對關鍵點提取特征的過程,應該具備可重復性、可區分性、准確性、有效性和魯棒性。

SIFT(Scale-Invariant Feature Transform)是一種特征描述子。該描述子具有尺度不變性和光照不變性。

檢測尺度空間極值

構建尺度空間

這里的尺度可以理解為圖像的模糊程度,就是眼睛近視的度數。尺度越大細節越少,SIFT特征希望提取所有尺度上的信息,所以對圖像構建尺度空間, 也就是實用不同的平滑核對圖像進行平滑。

It has been shown by Koenderink (1984) and Lindeberg (1994) that under a variety of reasonable assumptions the only possible scale-space kernel is the Gaussian function.

所以,這里的平滑核選用高斯核,空間尺度有高斯核尺度決定

其中是原圖像,*是卷積符號,對應尺度下的尺度圖像。是高斯核。

enter description here

不同尺度下的圖像.jpg

其中左上角為原圖,右上角為 尺度下的圖像,下行左右分別是 尺度的圖像。

尺度空間描述了不同模糊程度上的特征,而並沒有刻畫圖像尺寸大小的情形,所以文中將尺度空間和圖像金字塔結合起來。圖像的金字塔是通過對圖像逐步平滑下采樣得到的。

令每一層金字塔(octave)中尺度變化范圍為,每層金字塔測量s個尺度,那么第t層金字塔的尺度范圍就是,第層金字塔的第一幅圖像由上層塔中尺度下的下采樣的到,下采樣比例為0.5.

最終的尺度金字塔圖像如下:

enter description here

尺度金字塔.jpg

每一層金字塔中多層尺度變化因子是,第n層尺度是這樣能夠保證從金字塔底部到頂部的尺度是連續的
,

DoG極值
現在已經將圖像變到尺度空間了,希望在這個空間找到比較顯著的點,即變化明顯的點,也就是說在圖像逐漸模糊的過程中引起你注意的點,這個點突不突出可以通過尺度軸上變化趨勢來體現,即尺度軸上的梯度極值。

在尺度軸上計算梯度就是圖像沿着尺度軸差分唄

其示意圖如下:

enter description here

DoG示意圖.jpg

這里DoG近似等於尺度歸一化的高斯拉普拉斯算子,而尺度歸一化的高斯拉普拉斯算子相較於其他角點檢測算子,如梯度,Hessian或Harris焦點特征能夠更穩定的圖像特征[1],這篇參考文獻我沒看。

現在就要找極值點了,在DoG空間中尋找極值,也就是說比周圍點都大或者都小的點認為是關鍵點。既然DoG是差分圖像疊在一起的,這里的周圍當然是3D的周圍,共包括相鄰的26個鄰點。如下圖標注的點要和周圍26個綠色的點比較。

enter description here

DoG極值.jpg

那現在就是沿着尺度軸,逐步查找對應尺度上的極值。我們現在在圖像的一個像素點沿着尺度軸看過去,就成了一維圖像,讓我們看看這個問題。

每層金字塔中有s層尺度圖像,就是說有s個尺度,我們希望在s個尺度上都尋找極值點,那么應該有s+2層DoG圖像才可以,因為這個過程是三層數據比較嘛。 而DoG圖像是兩層圖像差分得來的,所以s+2層DoG圖像應該需要s+3層尺度圖像。
所以在每一層金字塔上都應該計算s+3層尺度圖像。

enter description here

s+3.jpg

注:這里是沿着尺度軸類比到一維上觀測的示意圖。圖中單位尺度使用a表示,每一層金字塔包含3個尺度,即 。發現第一層金字塔最后尋找尺度為到 ,而第二層金字塔中最先尋找到的尺度為 ,所以尺度是連續的。

這樣我們就從DoG空間中粗略的找到了關鍵點。但為了進一步精化結果,需要對檢
的結果進行篩選,去掉噪聲點。


去除干擾

無論是LoG還是DoG在做關鍵點檢測時都會受到邊緣的影響,如下圖

enter description here

1474451992792.jpg

圖中最高點實際上是在一個一條脊線上相對較高的地方,那么認為這個點並不是blob,而是邊緣的一部分,但是這種點再DoG空間中是會被找極值找到的。

對於這種邊緣,雖然是一個極值點,但是會發現這個極值垂直於邊緣方向變換劇烈而平行於邊緣變化相對平緩,那么就可以通過這兩個方向變化幅度的比值判定找到的最大值點是山脊上的一處制高點還是一處獨立的山峰即blob的中心點。下圖是山脊線在不同方向的剖面,其中上一張子圖是平行於脊線,下圖垂直於脊線。

enter description here

1474452230592.jpg

當然了也會存在平面上的一個很小的土丘被檢測出來,這被認為是噪聲點,這種噪聲在DoG空間的幅值都比較小,可以通過閾值化處理。

要去除干擾就要分別處理這兩種情況。

去除干擾1: 較小的極值
當然可以直接對找到的極值點的值進行閾值化過濾,但是為了更加精確的定位關鍵點的位置,對關鍵點進行3D二次函數的擬合(可以類比最優化里牛頓法的做法),然后對函數求極值。

將每個關鍵點的一段函數進行泰勒二次展開:

其中x是相對於關鍵點的距離。分別表示三元函數`!$D(x,y,\sigma)'在關鍵點的取值和一階導數,二階導數。這個展開就是在關鍵點周圍擬合出的3D二次曲線,找極值就令其導數為零。於是:

此時的極值為

文中剔除的點。

去除干擾2:邊緣噪聲

一維情形下曲線的變化趨勢可以通過曲率反應。

enter description here

1474454391240.jpg

那么在檢測最大值點是不是邊緣噪聲時可以選擇曲面變化最大和最小的兩個剖面,判斷其剖面曲線在該點的曲率,曲率越大表示越陡峭,曲率越小表示越平緩,而對於blob區域,即山峰而言,理想狀態是任意方向的曲率都相同且比較大。而山脊線即邊緣則會在沿線方向的變化較緩慢,即曲率較小,在垂直脊線的方向變化較劇烈,曲率較大。可以通過兩個曲率的比值判定是山峰還是山脊線。

對於二維曲面,曲面點處的二階矩矩陣,即Hessian矩陣刻畫了該點周圍的變化趨勢。說白了二階矩矩陣就是二元函數在該點的協方差矩陣,協方差矩陣的特征值對應着在特征向量方向上的投影,該值越大就反應函數在該方向變化趨勢越緩慢,也就是曲率越大。所以說Hessian矩陣的特征值和特征值所在特征向量方向上的曲率成正比。我們希望使用曲率的比值剔除邊緣點,就可以使用Hessian的特征值的比值替代曲率的比值。

enter description here

1474455614773.jpg

Hessian矩陣定義如下:

可以由二階差分計算得到,那么接下來就可以計算特征值的比值了。

先等一等,假設兩個特征值分別為,看下面兩個式子:

其中分別是矩陣的跡和矩陣的行列式,這樣發現特征值的比值可以通過這兩個兩計算得到,而不需要特征值分解,這樣簡單多了。
假設為較大特征值,且,則

最小,所以當越大時,對應的越大。所以我們要將的點剔除就相當於將的點剔除。論文中

關鍵點的表示

ok,在DoG空間中已經找到並細化出若干關鍵點,那么這些關鍵點該怎么表示呢?
可以使用三元組表示關鍵點,其中三個值分別表示關鍵點的位置、尺度和方向。為什么要計算特征點的方向呢?這是為了使特征描述子具有旋轉不變特性(下一節有講到,為什么就旋轉不變了)。
樣本點的方向定義(其實就是對應尺度圖像上對應位置的梯度):

是對應尺度的尺度圖像。

而關鍵點的方向是由他周圍區域內樣本點決定的,比如區域內的所有樣本點計算梯度值和方向,將方向分為若干個bins,然后使用高斯函數加權將周圍樣本點統計出方向直方圖,比如論文中將一周360°分成36個bins,那么我們統計方向落在每個bins中樣本,將該樣本梯度值乘以高斯權重后加入這個bins中,就得到了長度為36的方向直方圖。在這個方向直方圖中,最大峰值對應的bins就是關鍵點的方向。如果存在多個峰值或者存在大於0.8倍最大峰值的bins,那么就在該點創建多個關鍵點,這些關鍵點的位置、尺度一致,但是方向不同(參考[2]中此處也存在錯誤)。

論文中采用的高斯權重函數的尺度,其中是該關鍵點所在的圖像在尺度空間中的尺度。而由高斯函數原則,關鍵點的鄰域半徑應該設置為.


局部圖象描述子

找到了圖像在不同尺度的關鍵點,我們還希望刻畫關鍵點周圍的特征,以利於后續的分類或者匹配等操作。

局部特征肯定離不開關鍵點周圍的區域了,將關鍵點附近半徑為的鄰域(論文中選取邊長為16的正方形鄰域)划分為的子區域(論文中推薦),在每個子區域統計長度為的方向直方圖(論文中直方圖長度為8),每個直方圖被稱為一個種子點,這樣一個關鍵點的特征描述子就是一個長度為的向量(論文中是維的特征向量)。

如下圖所示

enter description here

抽取特征.jpg

其中中間的點是檢測到的關鍵點,藍色的點表示該尺度圖像中的像素點,紅色方格表示划分出的子區域,在每個子區域統計方向直方圖得到種子點。這里我們只是示意,具體的區域大小接下來詳細討論。我們還注意到關鍵點發出的一條橙黃色箭頭,這表示關鍵點的方向。

那么該描述子怎么體現旋轉不變性呢?讓我們來看下面這個過程

enter description here

1474269727512.jpg

這兩個區域應該是一個圖像,只不過旋轉了90°,而如果按照‘從最上邊的點順時針統計E點的鄰域’,分別是計算出來的差別就會好大,但是如果我們將E點的方向固定,都指向右側,那么它周圍的鄰域的相對位置也就固定了,這時候再按照‘從最上邊的點順時針統計E點的鄰域’那么結果就是是相同的了,我們可以認為圖中左右兩個區域是同一區域的不同視角。

現在再來看圖像,圖像是規則的矩形區域,我們在統計方向直方圖是也是有固定的規則的,矩形區域的選擇一般都是平行於圖像邊緣的,所以為了去除旋轉的影響,可以,將每個關鍵的方向固定到相同方向,那么相同區域經過固定規則檢測出來的結果就非常相近,這就避免了旋轉角度的影響。一般可以將圖像旋轉,使關鍵點的方向統一對齊到圖像x軸的方向[3],然后再對旋轉后的圖像划分子區域統計方向直方圖。有些資料說將坐標軸方向旋轉到關鍵點方向上,可能意思和我一樣,但我覺得沒有“旋轉圖像使將關鍵點方向和x軸方向重合”這種表述清晰。我剛開始看到那種表述一直搞不明白在干嘛。。。

如下圖,我們將圖像旋轉使關鍵點的方向對齊到x軸方向,然后在使用紅色的網格對旋轉后的圖像統計方向直方圖。

enter description here

1474270989847.jpg

坐標旋轉后的值

這里的是關鍵點方向和x軸方向的夾角,順時針旋轉該角度為負值,逆時針為正值。

ok,現在保證描述子旋轉不變了,讓我們按照紅色網格區域划分子區域來統計方向直方圖吧。可是這時候又發現了個問題,這怎么統計啊?對於每旋轉的圖像正好像素點落在紅色網格內,可現在旋轉后落得亂七八糟,怎么辦呢?這時候就需要采用雙線性插值的方法插出網格點的值了~

我們從上圖中取出一小塊來分析:

enter description here

1474272202619.jpg

其中藍色的點就是旋轉后的點,而綠色的點就是網格的中心,我們現在要插值插出綠色點的值,就要看藍色點在這些點的影響了。圖中分別表示藍色的點對左上角綠色點的在兩個方向的影響率,最終的藍色點分布到左上角點的影響是,這里是綠色點的值。關於雙線性插值見[5][4].

假設綠色的點的梯度值為,方向為60°,那么其在左上角的影響為,方向為60°,為高斯權重。那么對於每一個網格點都要計算他周圍的點對他的影響,然后累加起來,這時候會產生不同的點在同一個網格點產生影響的方向不同,此時應該將方向插分到與之最近的統計方向上,使得方向直方圖更加准確。比如直方圖長度為8,那么每45°一個方向,所以60°的方向影響應該插分到45°和90°方向上,所以影響力有落在了45°方向上,落在90°方向上。

綜上,方向直方圖統計網格點處的值時,在方向o上增量為

這里,是p點周圍的旋轉后的樣本點,因為是逐像素的所以限制其距離在單位1內。的坐標,是高斯權重,分別是對該網格點在兩個方向的影響率和對所求方向上的影響率。

現在旋轉不變性還剩下一個一直沒有說的問題就是區域大小的選擇和高斯權重尺度的選擇。下面就和說一說~

在統計方向直方圖串聯成局部特征描述子時,每個子區域的選擇應該和計算關鍵點方向時的區域大小一致,即,其中是圖像在尺度空間的尺度。考慮到旋轉的問題,我們不希望旋轉后半徑為的區域內有部分是空的,所以我們選的區域要能夠在旋轉后仍然后的區域可以檢測到。

enter description here

1474275273487.jpg

另外由於需要采用雙線性插值的方法獲得網格點的值,所以每一個子區域的半徑為

總體區域的半徑應該為

去除光照影響
為了去除光照影響,一般將關鍵點生成的特征向量歸一化。

是方差。

描述子向量門限。 非線性光照,相機飽和度變化會造成某些方向的梯度值過大,而對方向的鑒別性微弱。因此一般歸一化后,取0.2截斷較大的梯度值,然后再次進行歸一化,提高特征的鑒別性。[3]

總結

將所有尺度上關鍵點提取的局部描述子取出來,就完成了圖像sift特征的提取。在圖像匹配時,對兩幅圖像分別提取sift特征,然后在每個尺度上進行描述子的匹配。在匹配中如果一個關鍵點的最小匹配距離和第二小匹配距離小於某個閾值,則認為是正確匹配。這里參見參考文獻3.

SIFT特征特性:

  • 尺度不變性

  • 旋轉不變性

  • 光照不變性

  • 鑒別性強,信息量豐富

SIFT特征的缺點

  • 實時性不高,因為不斷的下采樣和插值等操作

  • 對於邊緣光滑的目標無法准確提取特征點

SIFT特征的用途
主要解決圖像配准和目標識別跟蹤中下述問題

  • 目標的旋轉、縮放、平移

  • 圖像的仿射/射影變換

  • 部分減輕光照影響

  • 目標的部分遮擋

  • 雜物場景(crowd scene)

  • 噪聲


后序
關於LoG和DoG的關系以及什么是尺度歸一化的問題,還有我想了好久的問題:LoG和DoG都是通過zero-acrossing檢測邊緣的,這里為什么使用極值來檢測blob?這些將在下一篇文章斑點檢測分析。


由於最近在挖目標跟蹤的東西,就挖到了sift特征,所以花了近一周時間看了Lowe的論文,加上網上的資料,總的來說應該還算清楚的捋順了SIFT特征的原理。

關於具體的實驗及其結果,我暫時沒有實現,因為我了解SIFT只是為了更好的理解現在看的東西,所以暫時就不實現了,等忙完了這一段,抽空把代碼補上。



  1. Mikolajczyk,K. 2002. Detection of local features invariant to affine transformation, Ph.D. thesis, Institut National Polytechnique de Grenoble, France.

  2. Rachel-Zhang, Sift特征提取分析,CSDN blog,2012,6

  3. zddhub,SIFT算法詳解,CSDN blog,2012,4

  4. 雙線性插值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM