1. 程式人生 > >基於影象配準的影象特徵檢測之sift演算法----sift演算法總結

基於影象配準的影象特徵檢測之sift演算法----sift演算法總結

身為菜鳥的我,花了將近3個月的時間把sift演算法吃透並自己把演算法實現啦,實在是耗時耗力呀,為了對得起我這段時間的努力,決定把自己對sift演算法的理解和大家分享一下,有什麼錯誤望各位大神指教,小妹在此獻醜啦。

一     概念

sift---Scale Invariant Feature Transform,尺度不變特徵匹配變換演算法。sift特徵對旋轉、尺度縮放、亮度變化等具有不變性,是非常穩定的區域性特徵。

二    主要思路

構造影象尺度空間表示-----尺度空間中搜索影象的極值點----由極值點建立特徵描述向量-----用特徵描述向量進行相似度匹配。



1、詳細講解

(1)   構建LOG影象

這裡有兩個概念需要區分清楚:金字塔多解析度、影象的多尺度空間。

多尺度空間表示由不同的高斯核平滑卷積得到(即此步驟所做之事),在所有尺度上具有相同的解析度。而金字塔多解析度表示每層解析度減少固定比例。

影象尺度空間的形成是通過將影象與具有可變核的高斯濾波器進行卷積, 從而得到影象的高斯金字塔 LoG。高斯卷積核是實現尺度變換的唯一線性變換核,一幅影象在尺度空間中可表示為影象和可變高斯核函式的卷積,採用高斯金字塔(Laplacian of Gaussian,LoG )運算元表示如下:

L(x, y,σ ) = G(x, y,σ ) ⊗ I(x, y)

其中, I(x,y) 為輸入的二維影象,

為可變高斯核函式, σ 為可變核。

David指出,高斯金字塔 LoG 共分為O 組,每組 S +3 層, S 為σ 與 2σ 之間的層數, S 一般取 2 或 3。在這裡我們構建5層多尺度空間,即S=2。

高斯金字塔組數一般為:

O=[log2min(m,n)]-3

m,n分別表示影象的行和列。

高斯模糊引數σ,計算公式如下:

σ(o,s)=σ0*2(o+s)/S

其中,σ0為初始尺度因子,S為每組層數,s為每組內具體哪一組。在羅伊的演算法實現中,以上引數的取值為:σ0=1.6*21/S相鄰組間尺度關係:σo+1=2σo

總結:相鄰兩組的同一層尺度為2倍的關係。相鄰層之間為k倍的關係。k=21/S,S

為每組的的層數。在我們的程式中S2

構建步驟:

1)先將採集到的圖擴大為原圖的兩倍,稱為I。

2)對I進行高斯濾波,形成不同尺度下(即σ不同)的5(S +3)張(層)高斯模糊影象,這稱為金字塔的第1組影象。如下圖所示:


σ大小決定影象的平滑程度,大尺度對應影象的概貌特徵,小尺度對應影象的細節特徵。大的σ值對應粗糙尺度(低解析度),反之,對應精細尺度(高解析度)。

3)第2組影象的第一層由第1組的倒數第3層影象降取樣(尺寸縮小一半,即水平、豎直方向1/2)得到,然後重複2)得到第2組影象,同理可得到其他組影象。

 

經過模糊與降取樣,最終得到影象:


(2)   構建DoG影象

DoG--Difference of Gaussian,差分金字塔。DoG運算元定義為兩個不同尺度的高斯核的差分,它是歸一化高斯拉普拉斯(LoG)運算元的近似。很多資料都有介紹,所以原理在這裡將不詳細介紹。DoG運算元定義如下:

D(x,y,σ ) = (G(x, y,kσ ) − G(x, y,σ ) ⊗ I(x,y) = L(x, y,kσ ) − L(x, y,σ )

其中,因子 k 滿足 k =21/ S

在實際計算時,使用高斯金字塔每組中相鄰上下兩層影象相減,得到高斯差分影象,如圖3.3所示,進行極值檢測。


(3)   空間極值檢測

檢測DOG區域性極值點。使用Laplacianof Gaussian能夠很好地找到找到影象中的興趣點,但是需要大量的計算量,所以使用Differenceof Gaussian影象的極大極小值近似尋找特徵點DOG運算元計算簡單,是尺度歸一化的LoG運算元的近似。

尋找DoG極值點時,每一個畫素都需要和與它同一尺度以及相鄰尺度的所有鄰域點相比較,當其大於或小於它的影象域和尺度域的所有相鄰點時,即為極值點。如圖:


中間的檢測點(打X)和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維影象空間都檢測到極值點。


s=3的情況

由於首層和末層都缺少一個鄰近層,因此搜尋從每組的第二層開始,以第二層為當前層,第一層和第三層分別作為立方體的上下層,搜尋完成後再以第三層作為當前層做同樣的搜尋。所以每層的點搜尋兩次。

解釋一下:為什麼上邊提到,每一組中生成的層數是S+3層呢?

其實層數確實是3層,但是為了為了滿足尺度變化的連續性,我們在每一組影象的頂層繼續用高斯模糊生成了 3 幅影象,高斯金字塔有每組S+3層影象。DOG金字塔每組有S+2層影象.

這裡不理解什麼叫“為了滿足尺度變化的連續性”,現在做仔細闡述:

假設s=3,也就是每個塔裡有3層,則k=21/s=21/3,那麼按照上圖可得GaussSpace和DoGspace 分別有3個(s個)和2個(s-1個)分量,在DoGspace中,1st-octave兩項分別是σ,kσ;2nd-octave兩項分別是2σ,2kσ;由於無法比較極值,我們必須在高斯空間繼續新增高斯模糊項,使得形成σ,kσ,k2σ,k3σ,k4σ這樣就可以選擇DoGspace中的中間三項kσ,k2σ,k3σ(只有左右都有才能有極值),那麼下一octave中(由上一層降取樣獲得)所得三項即為2kσ,2k2σ,2k3σ,其首項2kσ=24/3。剛好與上一octave末項k3σ=23/3尺度變化連續起來,所以每次要在Gaussianspace新增3項,每組(塔)共S+3層影象,相應的DoG金字塔有S+2層影象。

(4)   特徵點定位

以上方法檢測到的極值點是離散空間的極值點,通過擬和三維二次函式以精確確定關鍵點的位置和尺度(達到亞畫素精度),同時去除低對比度的關鍵點(對噪音敏感)和不穩定的邊緣響應點(定位在邊角)(因為DoG運算元會產生較強的邊緣響應),以增強匹配穩定性、提高抗噪聲能力,在這裡使用近似HarrisCorner檢測器。

1)關鍵點的精確定位

利用已知的離散空間點插值得到的連續空間極值點的方法叫做子畫素插值(Sub-pixelInterpolation)。


為了提高關鍵點的穩定性,需要對尺度空間DoG函式進行曲線擬合。利用DoG函式在尺度空間的Taylor展開式(擬合函式)為:

(4-1)

其中, 。求導並讓方程等於零,可以得到極值點的偏移量為:

通過多次迭代得到最終候選點的精確位置及尺度 ,將其帶入下列公式


可求出

其中, 代表相對插值中心的偏移量,當它在任一維度上的偏移量大於0.5時(即x或y或 ),意味著插值中心已經偏移到它的鄰近點上,所以必須改變當前關鍵點的位置。同時在新的位置上反覆插值直到收斂;也有可能超出所設定的迭代次數或者超出影象邊界的範圍,此時這樣的點應該刪除,在Lowe中進行了5次迭代。另外, 過小的點易受噪聲的干擾而變得不穩定,所以將 小於某個經驗值(Lowe論文中使用0.03,Rob Hess等人實現時使用0.04/S)的極值點刪除。

具體過程:

a)    空間尺度函式泰勒展開式如下: …(1)

對上式求導,並令其為0,得到精確的位置, 得 …(2)

b)    在已經檢測到的特徵點中,要去掉低對比度的特徵點和不穩定的邊緣響應點。去除低對比度的點:把公式(2)代入公式(1),即在DoG Space的極值點處D(x)取值,只取前兩項可得:

…(3)

若    ,該特徵點就保留下來,否則丟棄。

2)消除邊緣響應

由於DoG對影象中的邊緣有比較強的響應值,而一旦特徵落在圖形的邊緣上,這些點就是不穩定的點。根據Harris[4]角點可以知道,一個角點在任何方向上平移都應該保證區域性視窗內的畫素值的劇烈變化,而邊緣上的點沿著邊緣方向移動時區域性視窗內的畫素值基本沒有什麼變化。如下圖所示:


同樣,一個平坦的DoG響應峰值往往在橫跨邊緣的地方有較大的主曲率,而在垂直的方向有較小的主曲率。而主曲率可以通過2×2的Hessain矩陣H求出:


導數由取樣點相鄰差估計得到。

D的主曲率和H的特徵值成正比,可以避免求取具體的特徵值,因為我們只關心特徵值的比例。H的特徵值α和β代表x和y方向的梯度,則

Tr(H)表示矩陣H對角線元素之和,Det(H)表示矩陣H的行列式。假設是α較大的特徵值,而是β較小的特徵值,令α=γβ,則


D的主曲率和H的特徵值成正比,令為α最大特徵值,β為最小的特徵值,則公式 的值在兩個特徵值相等時最小,隨著的增大而增大。值越大,說明兩個特徵值的比值越大,即在某一個方向的梯度值越大,而在另一個方向的梯度值越小,而邊緣恰恰就是這種情況。所以為了剔除邊緣響應點,需要讓該比值小於一定的閾值,因此,為了檢測主曲率是否在某域值r下,只需檢測

(4-7)

式(4-7)成立時將關鍵點保留,反之剔除。在Lowe的文章中,取r=10。

(5)   特徵方向賦值

 為了實現影象旋轉的不變性,需要根據檢測到的特徵點的區域性影象結構求得一個方向基準。我們使用影象梯度的方法求取該區域性結構的穩定方向。對於已經檢測到特徵點,我們知道該特徵點的尺度值  ,因此根據這一尺度值,得到最接近這一尺度的高斯影象:

L(x,y)=G(x,y, )*I(x,y)

使用有限差分,計算以特徵點為中心,以3x1.5 為半徑的區域內影象梯度的幅角和幅值計算公式如下: 


L為關鍵點所在的尺度空間值,按Lowe的建議,梯度的模值m(x,y)按 高斯分佈加成(即高斯模板的σ為關鍵點的尺度的1.5倍),按尺度取樣的3σ原則,鄰域視窗半徑為

每個加入梯度方向直方圖的取樣點梯度幅值都要進行權重處理,加權採用圓形高斯加權函式,其σ值為特徵點尺度的1.5倍,由於sift演算法只考慮了尺度和旋轉的不變性,並沒有考慮仿射不變性。通過高斯加權,使特徵點附近的梯度幅值有較大的權重,這樣可以部分彌補因沒有仿射不變性而產生的特徵點不穩定的問題

在完成關鍵點的梯度計算後,使用直方圖統計鄰域內畫素的梯度方向和幅值。梯度直方圖的橫軸是梯度方向角,縱軸是梯度方向角對應的梯度幅值累加值。梯度直方圖將0~360度的方向範圍分為36個柱(bins),其中每柱10度。如圖5.1所示,直方圖的峰值方向代表了關鍵點的主方向,(為簡化,圖中只畫了八個方向的直方圖)。


方向直方圖的峰值則代表了該特徵點處鄰域梯度的方向,以直方圖中最大值作為該關鍵點的主方向。為了增強匹配的魯棒性,只保留峰值大於主方向峰值80%的方向作為該關鍵點的輔方向。因此,對於同一梯度值的多個峰值的關鍵點位置,在相同位置和尺度將會有多個關鍵點被建立但方向不同。僅有15%的關鍵點被賦予多個方向,但可以明顯的提高關鍵點匹配的穩定性。

至此,將檢測出的含有位置、尺度和方向的關鍵點即是該影象的SIFT特徵點。

解析:梯度的求取在特徵點對應的高斯影象(LOG影象)上。

(6)  特徵點特徵向量(方向描述子)生成

至此,我們確定了特徵點的位置、尺度和方向,接下來為每個特徵建立特徵描述符,即使用一組向量將這個關鍵點描述出來,這個描述子不但包括關鍵點,也包括關鍵點周圍對其有貢獻的畫素點。描述子不隨各種變化而改變,比如光照、視角、環境變化等。

描述子將被用來作為目標匹配的依據(所以特徵描述符應該有較高的獨特性,以便於減小特徵點的誤匹配率)。

特徵描述符大致包含三個步驟,即校正旋轉主方向、生成描述子、歸一化處理。其中旋轉主方向就是將座標軸旋轉為關鍵點的方向,以確保旋轉不變性。

描述子與特徵點所在的尺度有關,因此對梯度的求取應在特徵點對應的高斯影象上進行。

首先將座標軸旋轉為關鍵點的方向,以確保旋轉不變性。將關鍵點周圍分成dxd個子區域,每個子區域尺寸為mσ個像元(d=4,m=3, σ為特徵點的尺度值)。

考慮到實際計算時需要進行雙線性插值,所以計算的影象區域為mσ(d+1),再考慮旋轉,實際計算的矩形區域邊長為mσ(d+1) ,如圖所示:


為了保證特徵向量具有旋轉不變性,要以特徵點為中心,在附近鄰域內旋轉θ角,即旋轉為特徵點的方向。實際計算所需的影象區域半徑為:

 

計算結果四捨五入取整。



旋轉後鄰域內取樣點的新座標為:

  

旋轉好後,以關鍵點為中心取8×8的視窗。


Figure.16*16的圖中其中1/4的特徵點梯度方向及scale,右圖為其加權到8個主方向後的效果

圖左部分的中央為當前關鍵點的位置,每個小格代表關鍵點鄰域所在尺度空間的一個畫素,利用公式求得每個畫素的梯度幅值與梯度方向,箭頭方向代表該畫素的梯度方向,箭頭長度代表梯度模值,然後用高斯視窗對其進行加權運算。

圖中藍色的圈代表高斯加權的範圍(越靠近關鍵點的畫素梯度方向資訊貢獻越大)。然後在每4×4的小塊上計算8個方向的梯度方向直方圖,繪製每個梯度方向的累加值,即可形成一個種子點,如圖右部分示。此圖中一個關鍵點由2×2共4個種子點組成,每個種子點有8個方向向量資訊。這種鄰域方向性資訊聯合的思想增強了演算法抗噪聲的能力,同時對於含有定位誤差的特徵匹配也提供了較好的容錯性。

Lowe建議子區域的畫素的梯度大小按  的高斯加權計算,即


其中a,b為關鍵點在高斯金字塔影象中的位置座標。

此時每個子區域梯度方向直方圖將0°~360°劃分為8個方向區間,每個區間為45°,即每個種子點有8個方向區間的梯度強度資訊。

在實際計算過程中,為了增強匹配的穩健性,特徵點方向分配之後,接著生成特徵描述子。以特徵點為中心取 16×16 的視窗(特徵點所在的行和列不取),每個小格代表特徵點鄰域所在尺度空間的一個畫素,採用高斯加權(越靠近特徵點的畫素,梯度方向資訊貢獻越大)。在 4×4的影象小塊上計算 8 個方向的梯度方向直方圖,繪製每個梯度方向的累加值,形成一個種子點。

 


這樣就可以對每個feature形成一個4*4*8=128維的描述子,每一維都可以表示4*4個格子中一個的scale/orientation. 將這個向量歸一化之後,就進一步去除了光照的影響。

在歸一化處理後,對於特徵向量中值大於0.2的要進行截斷,即大於0.2的值只取0.2,然後再次進行歸一化處理,其目的是為了提高特徵的鑑別性。


相關推薦

OPENCV的學習:影象特徵檢測Harris角點演算法

    影象檢測是影象分割,影象識別的基礎,也是不可缺少的關鍵。在視覺計算理論框架中,抽取二維影象的邊緣、角點、紋理等基本特徵,是整個框架的第一步;本文章對Harris角點演算法做了比較詳細的理論介紹以及相關實現。 Part One:角點型別介紹 在現實世界中,角點

基於影象影象特徵檢測sift演算法----sift演算法總結

身為菜鳥的我,花了將近3個月的時間把sift演算法吃透並自己把演算法實現啦,實在是耗時耗力呀,為了對得起我這段時間的努力,決定把自己對sift演算法的理解和大家分享一下,有什麼錯誤望各位大神指教,小妹在此獻醜啦。 一     概念 sift---Scale Invari

影象基於灰度的模板匹配演算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD演算法

簡介:        本文主要介紹幾種基於灰度的影象匹配演算法:平均絕對差演算法(MAD)、絕對誤差和演算法(SAD)、誤差平方和演算法(SSD)、平均誤差平方和演算法(MSD)、歸一化積相關演算法(NCC)、序貫相似性檢測演算法(SSDA)、hadamard變換演算法(

影象基於灰度的模板匹配演算法(三):劃分強度一致法(PIU)

簡介: 前面幾篇文章介紹了一些比較基本的基於灰度的影象配准算法: 本文將介紹一種類似的相似度測量演算法,叫做劃分強度一致法(Partitioned Intensity Uniformity,PI

基於影象原始畫素資訊的簡單CT/MRI醫學影象方法

//************************************************************************ // 函式名稱: ReposImg // 訪問許可權: public // 建立日期: 2016/12/08 // 創 建 人: //

應用 OpenCV 進行 增強相關係數(ECC)最大化的影象

目錄 1.基於ORB自動化影象透視變換方法 2.影象對齊的歷史知識 3.應用ECC進行影象對齊 4.參考資料 想說的話: 研究該專題是因為在後續使用隨機森林做樣本訓練的過程中我需要提前製作樣本的資料集,但是這就面臨一個問題:影象的對齊問題 為了解決影象的對齊問題,我查到了

matlab 兩幅影象

兩幅影象配準。修改影象路徑之後,由於uiwait(msgbox('Click OK after closing the CPSELECT window.','Waiting...'));會有彈窗,先無視別關掉。接著再兩幅影象選定 成對對稱點,儲存工作空間再退出就可以了。

OpenCV的影象融合

OpenCV的影象配準融合   對極幾何(雙視幾何) FindFundamentalMat 由兩幅影象中對應點計算出基本矩陣 nt cvFindFundamentalMat( const CvMat* points1,

影象方面的演算法總結

影象配准算法\小總結 首先,影象配準要素結合:特徵空間,搜尋空間,搜尋策略,近似性度量;影象配準方法: 1.基於灰度資訊的方法:交叉相關(互相關)方法,相關係數度量,序貫相似檢測演算法,資訊理論

當前深度影象方法介紹

    本文主要分析了A review of recent range image registration methods with accuracy evaluation這篇文章中所介紹的各種粗匹配和精確匹配的方法 l A review of recentrange

(2)MATLAB 車牌影象

matlab 2011a版本 clear all >> Iin=imread('leftside.bmp'); >> Ibase=imread('calibrated.bmp'); >> figure >> subplo

影象SIFT

(一)影象特徵匹配--SIFT 1.1 SIFT背景簡介         SIFT演算法是David Lowe在1999年提出的區域性特徵描述子,並在2004年深入發展和完善。         SIFT演算法是

醫學影象 | Voxelmorph 微分同胚 | MICCAI2019

- 文章轉載:微信公眾號「機器學習煉丹術」 - 作者:煉丹兄(已授權) - 聯絡方式:微信cyx645016617(歡迎交流) - 論文題目:‘Unsupervised Learning for Fast Probabilistic Diffeomorphic Registration’ ![](https

(四)OpenCV中的特徵檢測SIFT(尺度不變換特徵)

註釋:本文翻譯自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括對原文件種錯誤程式碼的糾正1.目標學習SIFT演算法的概念學習如何找到SIFT關鍵點和描述符2.理論在最後幾章,我們看到了一些角落探測器,如Harris Co

目標檢測SSD:RefineNet演算法理解

RefineDet是CVPR2018的論文,個人覺得是一篇很不錯的文章,大致上是SSD演算法和RPN網路、FPN演算法的結合,可以在保持SSD高效的前提下提高檢測效果(實驗效果提升挺明顯)。第一眼看到這篇文章就讓我想起了RON,畢竟都是想做one stage和two stag

【OpenCV學習筆記】三十七、特徵檢測與匹配(二)——SIFT特徵點匹配

特徵檢測與匹配(二)——SIFT特徵點匹配 1.SIFT特徵點提取 2.繪製特徵點 3.特徵點描述符(特徵向量)提取 4.使用暴力匹配器進行暴力匹配 5.對匹配結果進行篩選(依據DMatch結構體中的float型別變數distance進行篩選) 6.繪製匹配結果 先上ppt

運動目標檢測 GMM背景模型演算法

綜述 單高斯背景建模是一種基於畫素樣本統計資訊的背景表示方法,它是根據視訊中的每個畫素在時域上的概率統計資訊(均值/方差)來構建各個畫素的顏色分佈模型,依次來達到背景建模的目的。背景建模完成後,使用統計差分進行目標畫素判斷以達到對前景目標的檢測,同時用目標畫素不斷更新背景模型以實現對

碰撞檢測分離軸定理演算法講解

本文翻譯自@sevenson的文章Separating Axis Theorem (SAT) Explanation 。原文作者用的是ActionScript 3來編寫演算法,不過文中主要講述的還是演算法原理,我想一旦演算法原理被我們掌握了,選擇什麼程式語言來實

基於C++和OpenCv的SIFT_影象區域性特徵檢測演算法程式碼的實現

SIFT:尺度不變特徵變換匹配演算法詳解 本章將要講解的內容如下所示:    1)SIFT演算法的簡介    2)SIFT演算法的實現細節    3)SIFT演算法的應用領域    4)SIFT演算法的改進與擴充套件 一 SIFT演算法的簡介   1)傳統的特徵提取方法 成

目標檢測影象特徵提取(四)OpenCV中BLOB特徵提取與幾何形狀分類

OpenCV中BLOB特徵提取與幾何形狀分類一:方法二值影象幾何形狀提取與分離,是機器視覺中重點之一,在CT影象分析與機器人視覺感知等領域應用廣泛,OpenCV中提供了一個對二值影象幾何特徵描述與分析最有效的工具 - SimpleBlobDetector類,使用它可以實現對二