sift算法研究_無匹配1 sift簡介 David G. Lowe在1999年提出了尺度不變的特征(Scale-Invariant Feature),用來進行物體的識別和圖像匹配等,并于2004年進行了更深入的發(fā)展和并加以完善。SIFT(Scale-Invariant Feature Transform)算子是一種圖像的局部描述子,具有尺度、旋轉(zhuǎn)、平移的不變性,而且對光照變化、仿射變換和3維投影變換具有一定的魯棒性。在Mikolajczyk對包括SIFT算子在內(nèi)的十種局部描述子所做的不變性對比實驗中,SIFT及其擴展算法已被證實在同類描述子中具有最強的健壯性。 算法的主要思想是在尺度空間尋找極值點(注意不是平面上的極值點,因此需要過濾掉平面上的極值點),然后對極值點進行過濾,找出穩(wěn)定的特征點。最后在每個穩(wěn)定的特征點周圍提取圖像的局部特性,形成局部描述子并將其用在以后的匹配中。SIFT算法是基于Lindeberg[4]的理論解決了尺度不變性的問題,本文會對尺度空間理論做一些介紹。 2 尺度空間 SIFT算法提取的特征點具有尺度不變性,也就是說,同一物體在圖片上不論尺度大小,都能根據(jù)SIFT算法提取到相同的特征點。這種尺度不變性是根據(jù)尺度空間理論得來的。 2.1 問題提出 在計算機中,一幅圖像通常是用像素矩陣來表示的,每個像素?fù)碛姓麛?shù)類型的灰度級,人理解和解釋用這種方式表示的圖像是很容易的一件事情。但是,如果每個灰度級用小數(shù)來表示,人就不容易理解圖像。如今使用的矩陣表示法,圖像中所蘊含的信息是隱式的。也就是說,人眼從圖像中分辨出的有意義信息是隱式的,由于這些信息沒有明確的表示出來,計算機并不能感知。對于計算機來說,一個基本的問題是一副圖片中哪些點是相互關(guān)聯(lián)的以及哪些點對應(yīng)著一片場景中的一個物體。這就是原始分組和知覺組織的問題。從認(rèn)知學(xué)的角度講,在一幅圖像中,即使對一個事物沒有概念,或者并不熟悉它,人仍然能夠感知此物體的結(jié)構(gòu)。對于人腦來說,即使不知道為什么,也能推測場景中什么是重要的,什么僅是背景而已。 想要得知圖像中哪些是有意義的,必須先要明確這樣一個問題:在一幅圖像中,只有在一定的尺度范圍內(nèi),一個物體才有意義。舉一個例子,樹枝這個概念,只有在幾厘米到幾米的距離去觀察它,才能感知到它的確是樹枝;如果在微米級或者千米級去觀察,就不能感知到樹枝這個概念了,這樣的話可以感知到的是細(xì)胞或者是森林的概念。 因而,如果想要描述現(xiàn)實世界的結(jié)構(gòu),或者將三維物體映射到二維的圖像上去,多尺度表示將會至關(guān)重要。多尺度表示的概念很容易理解,舉例說明,繪制地圖時會有比例尺的概念。世界地圖中就只能夠顯示大洲大洋,以及較大的地域和國家;而一個城市地圖,甚至可以詳細(xì)的顯示出每條街道。 這里需要強調(diào)一點,事物是實實在在的存在的,但是通過圖像這個媒介,觀察者可以感知到的概念是不同的。 2.2 問題的解決 2.2.1 多尺度表示 為了使圖像中的信息由只有人類可感知的隱式信息,成為計算機可表示的顯式信息,可以采用“多尺度表示”(Multi-scale
Representation)的圖像表示法來解決。在進行圖像處理和圖像理解時,從圖像中提取何種信息,對圖像進行何種操作,都是要考慮的基本問題。為了有效的回答這些基本問題,可以對圖像分階段處理,前一階段處理得到的信息可供后續(xù)的處理使用。對于第一階段的處理,有個基本的約束——處理之前并不知道在圖像的場景中到底要提取什么內(nèi)容;而且,處理所得的特征相對于各種變換(例如光照的變化,圖像的尺寸以及視角的變化)要具有魯棒性。
圖1. 一個多尺度表示的示意圖。多尺度表示是用一個有序的信號序列來表示原始圖像,序列中的每個信號都在不同尺度上[5]。 多尺度表示的思想是,將原始信號“嵌入”到采用一個單參數(shù)變換得到的一系列信號中去,變換得到的每個信號對應(yīng)于單參數(shù)族中的一個參數(shù)(例如圖1 中t)。一個重要的要求是,多尺度表示中的較粗尺度應(yīng)該是較細(xì)尺度的簡化,而且較粗尺度是通過某種固定的方式,由較細(xì)尺度圖像經(jīng)過平滑得到。要滿足這個性質(zhì),可以有多種實現(xiàn)方式。但是一點不變,那就是高斯函數(shù)是唯一可用的平滑函數(shù)。[c1] 實現(xiàn)多尺度表示有多種方式,比如,早期會采用四分樹或者八分樹,以及圖像金字塔。金字塔是結(jié)合降采樣操作和平滑操作的一種圖像表示方式。它的一個很大的好處是,自下而上每一層的像素數(shù)都不斷減少,這會大大減少計算量;而缺點是自下而上金字塔的量化變得越來越粗糙,而且速度很快。(需要強調(diào)的是,這里的金字塔構(gòu)造方法和小波金字塔的構(gòu)造方法是類似的,對某一層的圖像進行平滑之后,再做降采樣,平滑目的是為了降采樣后的像素點能更好的代表原圖像的像素點,與多尺度表示中的平滑完全不是一個目的)。圖2 是金字塔表示法的一個示例 也就是說多尺度表示時,都會有平滑這一步 2.2.2尺度空間 上面提到的四分樹或者八分樹以及金字塔表示法,在獲得多尺度時所采取的步驟是相當(dāng)粗略的,尺度與尺度之間的“間隔”太大。而這里要提到的“尺度空間”(Scale-Space )表示法是多尺度表示的另外一種有效方法,它的尺度參數(shù)是連續(xù)的,并且所有尺度上空間采樣點個數(shù)是相同的(實際上,一個尺度上得到的就是一幅圖像,尺度空間采樣點也就是該尺度上圖像的像素點。也就是說,尺度空間表示法在各個尺度上圖像的分辨率都是一樣的)。尺度空間表示的主要思想是,由原始信號(例如一幅圖像)生成一系列信號,并用這些信號來表示原始信號,這個過程中,精細(xì)尺度的信息被逐步的平滑掉(可以認(rèn)為是細(xì)節(jié)信息被丟棄)。 要注意的是,并不是所有的尺度函數(shù)都可以用于生成尺度空間。因為一個很重要的問題是,從精細(xì)尺度到較粗糙的尺度的變換過程中,信息被逐漸的簡化和削弱。也就是說,較粗尺度不可能產(chǎn)生較細(xì)尺度中沒有的特征。Koenderink[7](1984 )和Lindeberg[8](1994 )已經(jīng)證明,在一些合理的約束之下,高斯函數(shù)是唯一的尺度空間的平滑核函數(shù)[7],而且是唯一的線性平滑核函數(shù)[8] 產(chǎn)生尺度空間的公式可以表示如下: 公式(1)表示,以t 作為尺度參數(shù),在整個定義域上用二維高斯核與輸入圖像做卷積,得到與t 對應(yīng)的尺度(即在該尺度上的一副圖像)。也可以采用與之等價的操作: 公式(2)采用了物理學(xué)中著名的熱擴散公式,熱擴散公式描述了在均勻介質(zhì)中,熱量是如何向各個方向均勻傳導(dǎo)的。注意到(2)式右邊是拉普拉斯算子的形式,拉普拉斯算子是各向同性的,這恰好符合熱傳導(dǎo)的特性。 3 SIFT方法介紹 SIFT 特征的優(yōu)點在前面已經(jīng)做了說明,下面將對SIFT 方法做詳細(xì)的介紹。SIFT 算法有以下幾個步驟: 1. 檢測尺度空間的極值點。 2. 抽取穩(wěn)定的關(guān)鍵點。 3. 為每個關(guān)鍵點指定一個或者多個方向。 4. 生成特征點描述子。
3.1 相關(guān)工作 采用特征點進行圖像匹配可以追溯到1981 年,Moravec[9] 采用角點檢測做立體匹配。1988 年,Harris 和Stephens[10] 改進了Moravec 的檢測器,使檢測到的特征更加穩(wěn)定。1992 年,Harris[11] 顯示了他的角點檢測器在運動跟蹤和3 維重構(gòu)方面的優(yōu)勢,從此之后,角點檢測方法被廣泛的使用。但是角點檢測有兩個問題,一是不但可以檢測出角點,而且對邊緣也十分敏感;二是它不是尺度無關(guān)的方法。焦點檢測最初的應(yīng)用多在于運動跟蹤和立體匹配方面,后來Zhang 等人[12] 在1995 年實現(xiàn)了圖像角點的匹配。他們使用了角點鄰域的關(guān)聯(lián)窗來尋找可能的匹配。 19 97 年Schmid 和Mohr[13]做出了開創(chuàng)性的工作,他們采用圖像的局部特征進行圖像匹配,使得一個特征可以和一個大的圖像庫中的圖像做匹配。他們同樣采用Harris 角點,但不同的是,他們開創(chuàng)性的使用了旋轉(zhuǎn)不變的、圖像局部區(qū)域的描述子。 Harris 角點檢測對尺度變化十分敏感,Lowe 在1999 年實現(xiàn)了局部特征的尺度無關(guān)性,并且他提出了新的局部描述子,這種描述子更具獨特性和魯棒性。 最近,有很多工作致力于使局部特征對仿射變換具有不變性: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中所說的內(nèi)容 3.2 建立圖像尺度空間(或高斯金字塔),并檢測極值點 提取尺度不變的特征點,其主要思想是提取的特征點出現(xiàn)在任何一個尺度上。這樣不論圖像的尺度如何變化,總能夠提取出這種特征點。檢測尺度無關(guān)的特征點可以通過搜索所有可能的尺度,這可以基于尺度空間理論來解決。 前面已經(jīng)提到,在一些合理的假設(shè)之下,高斯函數(shù)是得到圖像尺度空間唯一可用的核函數(shù)。將圖像I (x, y) 的尺度定義為一個函數(shù)L(x, y,σ) ,它由高斯函數(shù)G(x, y,σ) 和圖像I (x, y) 卷積得到: L(x, y,σ) = G(x, y,σ) * I (x, y) , 為了在尺度空間中高效的檢測穩(wěn)定關(guān)鍵點的位置,[1][2] 提出在高斯差分函數(shù)與圖像卷積得到的空間D(x, y,σ) 中尋找極值點, D(x, y,σ) = (G(x, y, kσ) -G(x, y,σ) ) * I (x, y) = L(x, y, kσ) -L(x, y,σ) 。(3) 其中,相鄰兩個尺度由一個常數(shù)k 分開。 選擇這個公式有兩個原因。一是這個公式的計算是省時的,因為要描述尺度空間中的特征點,就必須計算輸入圖像的尺度L,而這里計算D 時,僅需要計算相鄰尺度函數(shù)的差值。另外一個原因是函數(shù)D 的性質(zhì)與尺度歸一化的拉普拉斯高斯函數(shù)——即σ2?2G 很相近[8]。而Mikolajczyk 在實驗中表明σ 2?2G的極大值和極小值能夠產(chǎn)生比其他函數(shù)(包括梯度,Hessian,Harris 角點函數(shù))更加穩(wěn)定的特征。D 和σ2?2G 的關(guān)系可由以下公式說 該公式是熱擴散公式的另一種表示形式,公式左邊的項可以用近似的方法計算: 所以可得: 從公式可以看出,D 和σ2?2G 的形式是類似的。由于拉普拉斯函數(shù)是尺度無關(guān)的,因而高斯差分函數(shù)也是尺度無關(guān)的。對于所有尺度而言,k 都是一個常數(shù),所以使用D 不會影響極值的選取。當(dāng)k 趨向于1 的時候,誤差會越來越小。但是實驗表明,即使k 值不接近1(例如k 取 2 ),對極值的選取也沒有多大影響。 3.2.1計算高斯差分圖像 前面已經(jīng)論述,為了求尺度無關(guān)的特征點,首先需要計算相鄰尺度圖像的差分,得到一系列圖像并在該圖像空間中求極值點。采用金字塔可以高效的計算高斯差分圖像,如圖5 所示:[c1] 既進行卷積又要進行降采樣形成金字塔
金子塔自下而上分為多層,在第一層中,對原始圖像不斷用高斯函數(shù)卷積,得到一系列逐漸平滑的圖像。在這一層中,相鄰的高斯圖像差分得到高斯差分圖像。這一組進行完畢后,從中抽取一幅圖像A 進行降采樣,得到圖像B 的面積變?yōu)锳 的1/4 ,并將B 作為下一層的初始圖像,重復(fù)第一層的過程。選取A 的原則是,得到A 所用的尺度空間參數(shù)σ為初始尺度空間參數(shù)的2 倍。設(shè)k = 21/ s ,在s 個尺度中尋找極值點,則每層要有s+3 幅圖像,生成s+2 幅高斯差分圖像。 經(jīng)驗值分別為3 和1.6* 21/3(*為乘號)。也就是說,k 取21/3 。 構(gòu)造D(x,y,e)的詳細(xì)步驟: 1、首先采用不同尺度因子的高斯核對圖像進行卷積以得到圖像的不同尺度空間,將這一組圖像作為金子塔圖像的第一層。 2、接著對第一層圖像中的2倍尺度圖像(相對于該層第一幅圖像的2倍尺度)以2倍像素距離進行下采樣來得到金子塔圖像的第二層中的第一幅圖像,對該圖像采用不同尺度因子的高斯核進行卷積,以獲得金字塔圖像中第二層的一組圖像。 3、再以金字塔圖像中第二層中的2倍尺度圖像(相對于該層第一幅圖像的2倍尺度)以2倍像素距離進行下采樣來得到金字塔圖像的第三層中的第一幅圖像,對該圖像采用不同尺度因子的高斯核進行卷積,以獲得金字塔圖像中第三層的一組圖像。這樣依次類推,從而獲得了金字塔圖像的每一層中的一組圖像。 4、對上圖得到的每一層相鄰的高斯圖像相減,就得到了高斯差分圖像。 5、因為高斯差分函數(shù)是歸一化的高斯拉普拉斯函數(shù)的近似,所以可以從高斯差分金字塔分層結(jié)構(gòu)提取出圖像中的極值點作為候選的特征點。對DOG 尺度空間每個點與相鄰尺度和相鄰位置的點逐個進行比較,得到的局部極值位置即為特征點所處的位置和對應(yīng)的尺度。 3.2.2計算極值點 上一步中已經(jīng)生成了高斯差分圖像,這一步中要計算該空間中的極值點。 為了尋找尺度空間的極值點,每一個采樣點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。如下圖,圖3所示,中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應(yīng)的9×2個點共26個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點。 有一個問題是到底要在多少個尺度中尋找極值點,即如何確定s 值。實驗表明,s 取3 是較好的選擇。如果s = 3,則需要5 幅高斯差分圖像才可以。這里的計算是高效的,因為大多數(shù)情況下,只需要幾步比較,就可以排除一個像素點,認(rèn)為它不是極值。 當(dāng)然這樣產(chǎn)生的極值點并不都是穩(wěn)定的特征點,因為某些極值點響應(yīng)較弱,而且DOG算子會產(chǎn)生較強的邊緣響應(yīng)。 3.3 抽取穩(wěn)定的關(guān)鍵點 上一步已經(jīng)求出了極值點,現(xiàn)在要對這些極值點進行篩選,去除不穩(wěn)定的點,以增強特征 不穩(wěn)定的點包括低對比度的點和邊緣上的點。 點匹配時的穩(wěn)定性、提高抗噪聲能力。同時,由于在金子塔中存在降采樣的圖像,在這些圖像中提取的極值點在原始輸入圖像中到底在什么位置,也是一個問題。下面將提出上面兩個問題的解決方案。 對于某一個尺度上求取的極值點,采用一個3 維的2 次函數(shù)求該極值點在原圖像上的位置,并去除低對比度的極值點。首先在某極值點A 對D(x, y,σ) 進行泰勒展開: 其中,X =(x, y,σ)T 是到點A 的偏移量。對(4)式求X 的偏導(dǎo)數(shù),并令偏導(dǎo)為零,得到 如果x) 大于0.5 ,也就意味著這個極值點和另一個采樣點(圖像中的另一個像素)離得更近。采用插值法求得極值點位置的估計值。 同時,可以利用D(x)) 去除低對比度的點。將公式(5)帶入公式(4)得 通過觀察實驗結(jié)果得出,D(x)) 絕對值小于0.03 的極值點都將被丟棄。為了得到穩(wěn)定的極值點,還要去除邊緣的影響,因為邊緣上的極值點抗噪性較差。曲面上每個點(非平點)都有兩個主方向,并且沿這兩個主方向的法曲率(即兩個主曲率)分別是曲面在該點法曲率的最大值和最小值。在邊緣上的極值點,垂直于邊緣的方向上,法曲率最大,沿邊緣的方向上,法曲率最小。如果極值點分布在邊緣上,該點的法曲率最大值和最小值之比(即兩個主曲率之比),一般情況下要比非邊緣點的比值大。根據(jù)這種思想,我們可以設(shè)一個比值的閾值,當(dāng)比值大于這個閾值就認(rèn)為極值點在邊緣上。可以采用近似的方法來求主曲率的比值。首先計算待測極值點的海瑟矩陣: 其中微分可以通過計算鄰近點的差值來近似計算。H 的特征值和D 的主曲率對應(yīng)成比例,這里 我們只需要計算H 的較大特征值與較小特征值的比例即可。設(shè)α是較大的特征值,β是較小的特征值,由矩陣性質(zhì)知: 其中用到了矩陣的跡和行列式。通常這里的行列式不會是負(fù)值,如果出現(xiàn)負(fù)值的情況,即兩個主曲率不同號,我們將丟棄這個點,不將其視為極值點。設(shè)r=α/ β,我們可得: 當(dāng)r≥1,(r +1)2 / r 是r 的單調(diào)遞增函數(shù),所以要計算主曲率的比值(即r)是否在某閾值之下,只需要判斷上式左邊的項是否在閾值之下即可。實驗表明,閾值通常選擇r = 10。 3.4 為關(guān)鍵點指定方向 SIFT特征的一個關(guān)鍵的特性是旋轉(zhuǎn)不變性,實現(xiàn)旋轉(zhuǎn)不變的基本思想是采用“相對”的概念。為關(guān)鍵點賦一個方向,定義的關(guān)鍵點描述子是相對于這個方向的,因而可以實現(xiàn)匹配時圖像的旋轉(zhuǎn)無關(guān)性。 , 為了實現(xiàn)尺度無關(guān)根據(jù)關(guān)鍵點所在的尺度選擇與該尺度最相近的高斯平滑圖像L。對于L 上的每個點L(x, y) ,計算梯度和方向 以關(guān)鍵點為中心,劃定一個鄰域,利用所有在此區(qū)域內(nèi)的點的梯度形成一個方向直方圖。直方圖的橫坐標(biāo)是梯度方向,共36 項,每項代表了10 度的范圍;縱坐標(biāo)是梯度大小,對于歸到橫坐標(biāo)上任一項內(nèi)所有的點,將其梯度大小相加,其和作為縱坐標(biāo)。如圖8 所示:
圖8. 方向直方圖從直方圖中選出縱坐標(biāo)值最大的一項的方向作為該關(guān)鍵點的主方向。如果存在其他方向,縱坐標(biāo)的大小大于主方向縱坐標(biāo)大小的80%,也將其作為該關(guān)鍵點的方向。特征點有多個方向的情況下,實際上是在此位置上有多個關(guān)鍵點,他們的方向不同。另外,為了獲得更好的穩(wěn)定性,可以對關(guān)鍵點鄰域的梯度大小進行高斯加權(quán)。有方法改進了采用直方圖指定方向的方式,改用PCA 求關(guān)鍵點的主方向。
3.5 局部描述子
前面已經(jīng)為關(guān)鍵點賦予了圖像位置、尺度以及方向,這一步將根據(jù)關(guān)鍵點周圍的局部特性計算一個特征描述子。這個描述子還需要對仿射變換、光照變換等具有一定的魯棒性。如圖9 所示,在關(guān)鍵點周圍取一個鄰域,并對其中點的梯度做高斯加權(quán)。這個鄰域分為四個子區(qū)域,每個子區(qū)域取八個方向,生成圖8 所示的相同形式的直方圖。 這是SIFT算法的最后一步,現(xiàn)在我們已經(jīng)得到了擁有尺度不變性和旋轉(zhuǎn)不變性的特征點,接下來要為每個特征點創(chuàng)建一個唯一標(biāo)識它的“指紋”,SIFT算法作者將它稱為SIFT描述子(descriptor)。所生成的SIFT描述子既要能讓相同場景中圖像的特征點能夠正確匹配,而且還要讓不同場景中圖像的特征點能夠正確區(qū)分。 為了得到這樣的SIFT描述子,我們將特征點周圍16*16的窗口分解為16個4*4的子窗口,圖2.12顯示了分解的過程。在每個4*4的子窗口中,計算出梯度的大小和方向,并用一個8個bin的直方圖來統(tǒng)計子窗口的平均方向,如圖2.13所示。 圖2.12將特征點周圍16*16的窗口分解為16個4*4的子窗口
圖2.13每個子窗口創(chuàng)建一個8bin的直方圖
梯度方向在0-44度范圍的像素點被放到第一個bin中,45-89度范圍的像素點被放到下一個bin中,依此類推。同樣加入到bin中的量依賴于該像素點梯度的大小。與之前不同的是,加入的量不僅與像素點的梯度大小相關(guān),而且還依賴離特征點的距離,這樣遠離特征點的像素點會加入較少的量到直方圖中。這通過一個高斯加權(quán)函數(shù)來實現(xiàn),這個函數(shù)生成一個加權(quán)值(像一個二維的鐘形曲線),用它乘以16*16的窗口中每個像素點的梯度大小,得到加權(quán)后的梯度大小,距離特征點越遠,要加入直方圖的像素點的梯度大小越小。 這樣每個4*4的子窗口都對應(yīng)一個8bin的直方圖,且直方圖中加入的值是像素的用高斯加權(quán)后的梯度大小,而特征點周圍16*16的窗口中包含16個4*4的子窗口,共有16*8=128個數(shù),然后將這128個數(shù)組成的向量進行單位化,單位化后的128維向量就是SIFT的描述子。 實現(xiàn)細(xì)節(jié) 在最后得到SIFT描述子前,我們還要處理兩個問題:旋轉(zhuǎn)依賴和亮度依賴。 由于SIFT描述子中包含梯度方向信息,如果我們旋轉(zhuǎn)圖像,那么所有的梯度方向都會改變。為了實現(xiàn)旋轉(zhuǎn)不變性,要使用2.5中計算出的特征點方向,在使用每個4*4子窗口中像素的梯度方向時,要先減去特征點方向。 由于某些圖像亮度變化較大,這可能會導(dǎo)致特征點周圍像素的梯度大小變化過大,也就是說在單位化后的SIFT描述子中某些維度的量要遠大于其它維度的量。為了減少亮度的依賴,我們將128維SIFT描述子中大于0.2的維度量截取為0.2,并對最后的128為描述子再做一次單位化。 通過這系列操作,我們最后得到了具有位置穩(wěn)定、尺度不變性、旋轉(zhuǎn)不變性和較少亮度依賴的SIFT描述子。 謝謝諸位 |
|