sift算法研究_無匹配

来源:互联网 发布:软件著作权设计说明书 编辑:程序博客网 时间:2024/04/29 04:51

http://www.cnblogs.com/slysky/archive/2011/10/30/2229530.html

1 sift簡介    

      David G. Lowe在1999年提出了尺度不變的特征(Scale-Invariant Feature),用來進行物體的識別和圖像匹配等,並於2004年進行了更深入的發展和並加以完善。SIFT(Scale-Invariant Feature Transform)算子是一種圖像的局部描述子,具有尺度、旋轉、平移的不變性,而且對光照變化、仿射變換和3維投影變換具有一定的魯棒性。在Mikolajczyk對包括SIFT算子在內的十種局部描述子所做的不變性對比實驗中,SIFT及其擴展算法已被證實在同類描述子中具有最強的健壯性。

      算法的主要思想是在尺度空間尋找極值點(注意不是平面上的極值點,因此需要過濾掉平面上的極值點),然後對極值點進行過濾,找出穩定的特征點。最後在每個穩定的特征點周圍提取圖像的局部特性,形成局部描述子並將其用在以後的匹配中。SIFT算法是基於Lindeberg[4]的理論解決了尺度不變性的問題,本文會對尺度空間理論做一些介紹。

2 尺度空間

      SIFT算法提取的特征點具有尺度不變性,也就是說,同一物體在圖片上不論尺度大小,都能根據SIFT算法提取到相同的特征點。這種尺度不變性是根據尺度空間理論得來的。

2.1 問題提出

      在計算機中,一幅圖像通常是用像素矩陣來表示的,每個像素擁有整數類型的灰度級,人理解和解釋用這種方式表示的圖像是很容易的一件事情。但是,如果每個灰度級用小數來表示,人就不容易理解圖像。如今使用的矩陣表示法,圖像中所蘊含的信息是隱式的。也就是說,人眼從圖像中分辨出的有意義信息是隱式的,由於這些信息沒有明確的表示出來,計算機並不能感知。對於計算機來說,一個基本的問題是一副圖片中哪些點是相互關聯的以及哪些點對應著一片場景中的一個物體。這就是原始分組和知覺組織的問題。從認知學的角度講,在一幅圖像中,即使對一個事物沒有概念,或者並不熟悉它,人仍然能夠感知此物體的結構。對於人腦來說,即使不知道為什麼,也能推測場景中什麼是重要的,什麼僅是背景而已。

      想要得知圖像中哪些是有意義的,必須先要明確這樣一個問題:在一幅圖像中,只有在一定的尺度范圍內,一個物體才有意義。舉一個例子,樹枝這個概念,只有在幾釐米到幾米的距離去觀察它,才能感知到它的確是樹枝;如果在微米級或者千米級去觀察,就不能感知到樹枝這個概念了,這樣的話可以感知到的是細胞或者是森林的概念。

     因而,如果想要描述現實世界的結構,或者將三維物體映射到二維的圖像上去,多尺度表示將會至關重要。多尺度表示的概念很容易理解,舉例說明,繪制地圖時會有比例尺的概念。世界地圖中就只能夠顯示大洲大洋,以及較大的地域和國家;而一個城市地圖,甚至可以詳細的顯示出每條街道。

     這裡需要強調一點,事物是實實在在的存在的,但是通過圖像這個媒介,觀察者可以感知到的概念是不同的。

 2.2 問題的解決

      2.2.1 多尺度表示

     為了使圖像中的信息由只有人類可感知的隱式信息,成為計算機可表示的顯式信息,可以采用「多尺度表示」(Multi-scale Representation)的圖像表示法來解決。在進行圖像處理和圖像理解時,從圖像中提取何種信息,對圖像進行何種操作,都是要考慮的基本問題。為了有效的回答這些基本問題,可以對圖像分階段處理,前一階段處理得到的信息可供後續的處理使用。對於第一階段的處理,有個基本的約束——處理之前並不知道在圖像的場景中到底要提取什麼內容;而且,處理所得的特征相對於各種變換(例如光照的變化,圖像的尺寸以及視角的變化)要具有魯棒性。
     多尺度表示事先並不知道到底要使用哪些尺度,所以要計算得出所有的尺度以供後面的步驟使用。一個多尺度表示的示意圖如圖1 所示。

 

圖1. 一個多尺度表示的示意圖。多尺度表示是用一個有序的信號序列來表示原始圖像,序列中的每個信號都在不同尺度上[5]。

多尺度表示的思想是,將原始信號「嵌入」到采用一個單參數變換得到的一系列信號中去,變換得到的每個信號對應於單參數族中的一個參數(例如圖1 中t)。一個重要的要求是,多尺度表示中的較粗尺度應該是較細尺度的簡化,而且較粗尺度是通過某種固定的方式,由較細尺度圖像經過平滑得到。要滿足這個性質,可以有多種實現方式。但是一點不變,那就是高斯函數是唯一可用的平滑函數。[c1] 

實現多尺度表示有多種方式,比如,早期會采用四分樹或者八分樹,以及圖像金字塔。金字塔是結合降采樣操作和平滑操作的一種圖像表示方式。它的一個很大的好處是,自下而上每一層的像素數都不斷減少,這會大大減少計算量;而缺點是自下而上金字塔的量化變得越來越粗糙,而且速度很快。(需要強調的是,這裡的金字塔構造方法和小波金字塔的構造方法是類似的,對某一層的圖像進行平滑之後,再做降采樣,平滑目的是為了降采樣後的像素點能更好的代表原圖像的像素點,與多尺度表示中的平滑完全不是一個目的)。圖2 是金字塔表示法的一個示例

也就是說多尺度表示時,都會有平滑這一步

2.2.2尺度空間

上面提到的四分樹或者八分樹以及金字塔表示法,在獲得多尺度時所采取的步驟是相當粗略的,尺度與尺度之間的「間隔」太大。而這裡要提到的「尺度空間」(Scale-Space )表示法是多尺度表示的另外一種有效方法,它的尺度參數是連續的,並且所有尺度上空間采樣點個數是相同的(實際上,一個尺度上得到的就是一幅圖像,尺度空間采樣點也就是該尺度上圖像的像素點。也就是說,尺度空間表示法在各個尺度上圖像的分辨率都是一樣的)。尺度空間表示的主要思想是,由原始信號(例如一幅圖像)生成一系列信號,並用這些信號來表示原始信號,這個過程中,精細尺度的信息被逐步的平滑掉(可以認為是細節信息被丟棄)。

要注意的是,並不是所有的尺度函數都可以用於生成尺度空間。因為一個很重要的問題是,從精細尺度到較粗糙的尺度的變換過程中,信息被逐漸的簡化和削弱。也就是說,較粗尺度不可能產生較細尺度中沒有的特征。Koenderink[7](1984 )和Lindeberg[8](1994 )已經證明,在一些合理的約束之下,高斯函數是唯一的尺度空間的平滑核函數[7],而且是唯一的線性平滑核函數[8]

產生尺度空間的公式可以表示如下:

 (1)

公式(1)表示,以t 作為尺度參數,在整個定義域上用二維高斯核與輸入圖像做卷積,得到與t 對應的尺度(即在該尺度上的一副圖像)。也可以采用與之等價的操作:

公式(2)采用了物理學中著名的熱擴散公式,熱擴散公式描述了在均勻介質中,熱量是如何向各個方向均勻傳導的。注意到(2)式右邊是拉普拉斯算子的形式,拉普拉斯算子是各向同性的,這恰好符合熱傳導的特性。

3 SIFT方法介紹

  SIFT 特征的優點在前面已經做了說明,下面將對SIFT 方法做詳細的介紹。SIFT 算法有以下幾個步驟:

  1. 檢測尺度空間的極值點。

  2. 抽取穩定的關鍵點。

  3. 為每個關鍵點指定一個或者多個方向。

  4. 生成特征點描述子。

 

3.1 相關工作

       采用特征點進行圖像匹配可以追溯到1981 年,Moravec[9] 采用角點檢測做立體匹配。1988 年,Harris 和Stephens[10] 改進了Moravec 的檢測器,使檢測到的特征更加穩定。1992 年,Harris[11] 顯示了他的角點檢測器在運動跟蹤和3 維重構方面的優勢,從此之後,角點檢測方法被廣泛的使用。但是角點檢測有兩個問題,一是不但可以檢測出角點,而且對邊緣也十分敏感;二是它不是尺度無關的方法。焦點檢測最初的應用多在於運動跟蹤和立體匹配方面,後來Zhang 等人[12] 在1995 年實現了圖像角點的匹配。他們使用了角點鄰域的關聯窗來尋找可能的匹配。 19 97 年Schmid 和Mohr[13]做出了開創性的工作,他們采用圖像的局部特征進行圖像匹配,使得一個特征可以和一個大的圖像庫中的圖像做匹配。他們同樣采用Harris 角點,但不同的是,他們開創性的使用了旋轉不變的、圖像局部區域的描述子。 Harris 角點檢測對尺度變化十分敏感,Lowe 在1999 年實現了局部特征的尺度無關性,並且他提出了新的局部描述子,這種描述子更具獨特性和魯棒性。

        最近,有很多工作致力於使局部特征對仿射變換具有不變性:Baumberg, 2000[14]; Tuytelaars and Van Gool, 2000[15]; Mikolajczyk and Schmid, 2002[16]; Schaffalitzky and Zisserman, 2002[17]; Brown and Lowe, 2002[18] 。

 (在開始之前,需要將彩色圖像處理成灰度圖像),然後進行3.2中所說的內容

3.2  建立圖像尺度空間(或高斯金字塔),並檢測極值點

提取尺度不變的特征點,其主要思想是提取的特征點出現在任何一個尺度上。這樣不論圖像的尺度如何變化,總能夠提取出這種特征點。檢測尺度無關的特征點可以通過搜索所有可能的尺度,這可以基於尺度空間理論來解決。

前面已經提到,在一些合理的假設之下,高斯函數是得到圖像尺度空間唯一可用的核函數。將圖像(xy) 的尺度定義為一個函數L(xy,σ) ,它由高斯函數G(xy,σ) 和圖像(x,y) 卷積得到:

L(xy,σ) = G(xy,σ) * (xy) ,

為了在尺度空間中高效的檢測穩定關鍵點的位置,[1][2] 提出在高斯差分函數與圖像卷積得到的空間D(xy,σ) 中尋找極值點,

D(xy,σ) = (G(xykσ) -G(xy,σ) ) * (xy) = L(xykσ) -L(xy,σ) 。(3)

其中,相鄰兩個尺度由一個常數k 分開。

選擇這個公式有兩個原因。一是這個公式的計算是省時的,因為要描述尺度空間中的特征點,就必須計算輸入圖像的尺度L,而這裡計算時,僅需要計算相鄰尺度函數的差值。另外一個原因是函數的性質與尺度歸一化的拉普拉斯高斯函數——即σ22很相近[8]。而Mikolajczyk 在實驗中表明σ 22G的極大值和極小值能夠產生比其他函數(包括梯度,HessianHarris 角點函數)更加穩定的特征。和σ22的關系可由以下公式說

該公式是熱擴散公式的另一種表示形式,公式左邊的項可以用近似的方法計算:

所以可得:

從公式可以看出,和σ22的形式是類似的。由於拉普拉斯函數是尺度無關的,因而高斯差分函數也是尺度無關的。對於所有尺度而言,k 都是一個常數,所以使用不會影響極值的選取。當k 趨向於1 的時候,誤差會越來越小。但是實驗表明,即使k 值不接近1(例如k 取 2 ),對極值的選取也沒有多大影響。

3.2.1計算高斯差分圖像

前面已經論述,為了求尺度無關的特征點,首先需要計算相鄰尺度圖像的差分,得到一系列圖像並在該圖像空間中求極值點。采用金字塔可以高效的計算高斯差分圖像,如圖5 所示:[c1] 

既進行卷積又要進行降采樣形成金字塔

 

 

金子塔自下而上分為多層,在第一層中,對原始圖像不斷用高斯函數卷積,得到一系列逐漸平滑的圖像。在這一層中,相鄰的高斯圖像差分得到高斯差分圖像。這一組進行完畢後,從中抽取一幅圖像A 進行降采樣,得到圖像B 的面積變為A 的1/4 ,並將B 作為下一層的初始圖像,重復第一層的過程。選取A 的原則是,得到A 所用的尺度空間參數σ為初始尺度空間參數的2 倍。設k = 21/ ,在s 個尺度中尋找極值點,則每層要有s+3 幅圖像,生成s+2 幅高斯差分圖像。

經驗值分別為3 和1.6* 21/3(*為乘號)。也就是說,k 取21/3 

構造D(x,y,e)的詳細步驟:

 1、首先采用不同尺度因子的高斯核對圖像進行卷積以得到圖像的不同尺度空間,將這一組圖像作為金子塔圖像的第一層。

 2、接著對第一層圖像中的2倍尺度圖像(相對於該層第一幅圖像的2倍尺度)以2倍像素距離進行下采樣來得到金子塔圖像的第二層中的第一幅圖像,對該圖像采用不同尺度因子的高斯核進行卷積,以獲得金字塔圖像中第二層的一組圖像。

 3、再以金字塔圖像中第二層中的2倍尺度圖像(相對於該層第一幅圖像的2倍尺度)以2倍像素距離進行下采樣來得到金字塔圖像的第三層中的第一幅圖像,對該圖像采用不同尺度因子的高斯核進行卷積,以獲得金字塔圖像中第三層的一組圖像。這樣依次類推,從而獲得了金字塔圖像的每一層中的一組圖像。

4、對上圖得到的每一層相鄰的高斯圖像相減,就得到了高斯差分圖像。

5、因為高斯差分函數是歸一化的高斯拉普拉斯函數的近似,所以可以從高斯差分金字塔分層結構提取出圖像中的極值點作為候選的特征點。對DOG 尺度空間每個點與相鄰尺度和相鄰位置的點逐個進行比較,得到的局部極值位置即為特征點所處的位置和對應的尺度。

3.2.2計算極值點

上一步中已經生成了高斯差分圖像,這一步中要計算該空間中的極值點。 為了尋找尺度空間的極值點,每一個采樣點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。如下圖,圖3所示,中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點。

有一個問題是到底要在多少個尺度中尋找極值點,即如何確定s 值。實驗表明,s 取3 是較好的選擇。如果s = 3則需要5 幅高斯差分圖像才可以。這裡的計算是高效的,因為大多數情況下,只需要幾步比較,就可以排除一個像素點,認為它不是極值。

當然這樣產生的極值點並不都是穩定的特征點,因為某些極值點響應較弱,而且DOG算子會產生較強的邊緣響應。

3.3 抽取穩定的關鍵點

上一步已經求出了極值點,現在要對這些極值點進行篩選,去除不穩定的點,以增強特征

不穩定的點包括低對比度的點和邊緣上的點。 點匹配時的穩定性、提高抗噪聲能力。同時,由於在金子塔中存在降采樣的圖像,在這些圖像中提取的極值點在原始輸入圖像中到底在什麼位置,也是一個問題。下面將提出上面兩個問題的解決方案。

對於某一個尺度上求取的極值點,采用一個3 維的2 次函數求該極值點在原圖像上的位置,並去除低對比度的極值點。首先在某極值點A 對D(xy,σ) 進行泰勒展開:

其中,=(xy,σ)是到點的偏移量。對(4)式求的偏導數,並令偏導為零,得到

如果x大於0.5 ,也就意味著這個極值點和另一個采樣點(圖像中的另一個像素)離得更近。采用插值法求得極值點位置的估計值。

同時,可以利用D(x)) 去除低對比度的點。將公式(5)帶入公式(4)得

通過觀察實驗結果得出,D(x)絕對值小於0.03 的極值點都將被丟棄。為了得到穩定的極值點,還要去除邊緣的影響,因為邊緣上的極值點抗噪性較差。曲面上每個點(非平點)都有兩個主方向,並且沿這兩個主方向的法曲率(即兩個主曲率)分別是曲面在該點法曲率的最大值和最小值。在邊緣上的極值點,垂直於邊緣的方向上,法曲率最大,沿邊緣的方向上,法曲率最小。如果極值點分布在邊緣上,該點的法曲率最大值和最小值之比(即兩個主曲率之比),一般情況下要比非邊緣點的比值大。根據這種思想,我們可以設一個比值的閾值,當比值大於這個閾值就認為極值點在邊緣上。可以采用近似的方法來求主曲率的比值。首先計算待測極值點的海瑟矩陣:

其中微分可以通過計算鄰近點的差值來近似計算。的特征值和的主曲率對應成比例,這裡

我們只需要計算的較大特征值與較小特征值的比例即可。設α是較大的特征值,β是較小的特征值,由矩陣性質知:

其中用到了矩陣的跡和行列式。通常這裡的行列式不會是負值,如果出現負值的情況,即兩個主曲率不同號,我們將丟棄這個點,不將其視為極值點。設r=α/ β,我們可得:

當r≧1,(+1)是r 的單調遞增函數,所以要計算主曲率的比值(即r)是否在某閾值之下,只需要判斷上式左邊的項是否在閾值之下即可。實驗表明,閾值通常選擇r = 10

3.4 為關鍵點指定方向

SIFT特征的一個關鍵的特性是旋轉不變性,實現旋轉不變的基本思想是采用「相對」的概念。為關鍵點賦一個方向,定義的關鍵點描述子是相對於這個方向的,因而可以實現匹配時圖像的旋轉無關性。

 為了實現尺度無關根據關鍵點所在的尺度選擇與該尺度最相近的高斯平滑圖像L對於上的每個點L(xy) ,計算梯度和方向

以關鍵點為中心,劃定一個鄰域,利用所有在此區域內的點的梯度形成一個方向直方圖。直方圖的橫坐標是梯度方向,共36 項,每項代表了10 度的范圍;縱坐標是梯度大小,對於歸到橫坐標上任一項內所有的點,將其梯度大小相加,其和作為縱坐標。如圖8 所示:

 

8. 方向直方圖從直方圖中選出縱坐標值最大的一項的方向作為該關鍵點的主方向。如果存在其他方向,縱坐標的大小大於主方向縱坐標大小的80%,也將其作為該關鍵點的方向。特征點有多個方向的情況下,實際上是在此位置上有多個關鍵點,他們的方向不同。另外,為了獲得更好的穩定性,可以對關鍵點鄰域的梯度大小進行高斯加權。有方法改進了采用直方圖指定方向的方式,改用PCA 求關鍵點的主方向。

 

3.5 局部描述子

 

前面已經為關鍵點賦予了圖像位置、尺度以及方向,這一步將根據關鍵點周圍的局部特性計算一個特征描述子。這個描述子還需要對仿射變換、光照變換等具有一定的魯棒性。如圖9 所示,在關鍵點周圍取一個鄰域,並對其中點的梯度做高斯加權。這個鄰域分為四個子區域,每個子區域取八個方向,生成圖8 所示的相同形式的直方圖。

這是SIFT算法的最後一步,現在我們已經得到了擁有尺度不變性和旋轉不變性的特征點,接下來要為每個特征點創建一個唯一標識它的「指紋」,SIFT算法作者將它稱為SIFT描述子(descriptor)。所生成的SIFT描述子既要能讓相同場景中圖像的特征點能夠正確匹配,而且還要讓不同場景中圖像的特征點能夠正確區分。

為了得到這樣的SIFT描述子,我們將特征點周圍16*16的窗口分解為16個4*4的子窗口,圖2.12顯示了分解的過程。在每個4*4的子窗口中,計算出梯度的大小和方向,並用一個8個bin的直方圖來統計子窗口的平均方向,如圖2.13所示。

圖2.12將特征點周圍16*16的窗口分解為16個4*4的子窗口

 

圖2.13每個子窗口創建一個8bin的直方圖

 

梯度方向在0-44度范圍的像素點被放到第一個bin中,45-89度范圍的像素點被放到下一個bin中,依此類推。同樣加入到bin中的量依賴於該像素點梯度的大小。與之前不同的是,加入的量不僅與像素點的梯度大小相關,而且還依賴離特征點的距離,這樣遠離特征點的像素點會加入較少的量到直方圖中。這通過一個高斯加權函數來實現,這個函數生成一個加權值(像一個二維的鐘形曲線),用它乘以16*16的窗口中每個像素點的梯度大小,得到加權後的梯度大小,距離特征點越遠,要加入直方圖的像素點的梯度大小越小。

這樣每個4*4的子窗口都對應一個8bin的直方圖,且直方圖中加入的值是像素的用高斯加權後的梯度大小,而特征點周圍16*16的窗口中包含16個4*4的子窗口,共有16*8=128個數,然後將這128個數組成的向量進行單位化,單位化後的128維向量就是SIFT的描述子。

實現細節

在最後得到SIFT描述子前,我們還要處理兩個問題:旋轉依賴和亮度依賴。

由於SIFT描述子中包含梯度方向信息,如果我們旋轉圖像,那麼所有的梯度方向都會改變。為了實現旋轉不變性,要使用2.5中計算出的特征點方向,在使用每個4*4子窗口中像素的梯度方向時,要先減去特征點方向。

由於某些圖像亮度變化較大,這可能會導致特征點周圍像素的梯度大小變化過大,也就是說在單位化後的SIFT描述子中某些維度的量要遠大於其它維度的量。為了減少亮度的依賴,我們將128維SIFT描述子中大於0.2的維度量截取為0.2,並對最後的128為描述子再做一次單位化。

通過這系列操作,我們最後得到了具有位置穩定、尺度不變性、旋轉不變性和較少亮度依賴的SIFT描述子。

謝謝諸位


原创粉丝点击