全网最详细SIFT算法原理实现
文章目錄
- 一、SIFT算法
- 1.1什么是SIFT算法?
- 1.2SIFT算法特點(diǎn)
- 二、SIFT算法實質(zhì)
- 2.1SIFT算法實現(xiàn)特征匹配主要有以下三個流程:
- 三、SIFT算法原理
- 3.1圖像金字塔
- 3.2創(chuàng)建圖像高斯金字塔
- 3.3高斯金字塔創(chuàng)建總圖
- 四、尺度空間
- 五、高斯差分金字塔
- 5.1極值點(diǎn)(Key points)的精確定位
- 5.2確定關(guān)鍵點(diǎn)(極值點(diǎn))方向
- 5.3關(guān)鍵點(diǎn)描述
- 5.4關(guān)鍵點(diǎn)匹配
- 六、sift代碼
- 七、總結(jié)
一、SIFT算法
1.1什么是SIFT算法?
尺度不變特征轉(zhuǎn)換(SIFT, Scale Invariant Feature Transform)是圖像處理領(lǐng)域中的一種局部特征描述算法. 該方法于1999年由加拿大教授David G.Lowe提出,申請了專利,其專利屬于英屬哥倫比亞大學(xué). SIFT專利在2020年3月17日之后到期,現(xiàn)在只需更新cv版本即可免費(fèi)使用.
SIFT算法不僅只有尺度不變性,當(dāng)旋轉(zhuǎn)圖像,改變圖像亮度,移動拍攝位置時,仍可得到較好的檢測效果.
其實,在我們生活中,SIFT算法還是有所應(yīng)用的,比如,我們手機(jī)上的全景拍攝,當(dāng)我們拿著手機(jī)旋轉(zhuǎn)拍攝時,就可以得到一幅全景圖,大家想過沒有,手機(jī)攝像頭的視角是確定的,為什么通過旋轉(zhuǎn)拍攝時,角度就變大了呢?其實角度并沒有變化,只是我們在旋轉(zhuǎn)拍攝時,拍攝了很多的圖像,這些圖像相鄰之間有重疊部分,把這些圖像合在一起,去除重疊部分,就可以得到一幅全景圖啦.
1.2SIFT算法特點(diǎn)
- 具有較好的穩(wěn)定性和不變形,能夠適當(dāng)旋轉(zhuǎn)、尺度縮放、亮度的變化,能在一定程度上不受視角變化、仿射變換、噪聲的干擾。
- 區(qū)分性好,能夠在海量特征數(shù)據(jù)庫中進(jìn)行快速準(zhǔn)確的區(qū)分信息進(jìn)行匹配
- 多屬性,就算只有單個物體,也能產(chǎn)生大量特征向量
- 高速性,能夠快速的進(jìn)行特征向量匹配
- 可擴(kuò)展性,能夠與其它形式的特征向量進(jìn)行聯(lián)合
二、SIFT算法實質(zhì)
在不同的尺度空間上查找關(guān)鍵點(diǎn),并計算出關(guān)鍵點(diǎn)的方向。
2.1SIFT算法實現(xiàn)特征匹配主要有以下三個流程:
三、SIFT算法原理
3.1圖像金字塔
圖像金字塔是一種以多分辨率來解釋圖像的結(jié)構(gòu),通過對原始圖像進(jìn)行多尺度像素采樣的方式,生成N個不同分辨率的圖像。把具有最高級別分辨率的圖像放在底部,以金字塔形狀排列,往上是一系列像素(尺寸)逐漸降低的圖像,一直到金字塔的頂部只包含一個像素點(diǎn)的圖像,這就構(gòu)成了傳統(tǒng)意義上的圖像金字塔。
獲得圖像金字塔一般包括二個步驟:
利用低通濾波器平滑圖像
對平滑圖像進(jìn)行抽樣(采樣)
有兩種采樣方式——上采樣(分辨率逐級升高)和下采樣(分辨率逐級降低)
上采樣:
下采樣:
3.2創(chuàng)建圖像高斯金字塔
什么是圖像高斯金字塔?
在說高斯金字塔之前,我們先來說一下人的眼睛,我們?nèi)搜蹖κ澜绲母兄袃煞N特性:一是近大遠(yuǎn)小:同一物體,近處看時感覺比較大,遠(yuǎn)處看時感覺比較小;二是"模糊":更準(zhǔn)確說應(yīng)該是"粗細(xì)",我們看近處,可以看到物體的細(xì)節(jié)(人會覺得比較清楚),比如一片樹葉,近看可以看到該樹葉的紋理,遠(yuǎn)處看只能看到該片的大概輪廓(人會覺得比較模糊). 從頻率的角度出發(fā),圖像的細(xì)節(jié)(比如紋理,輪廓等)代表圖像的高頻成分,圖像較平滑區(qū)域表示圖像的低頻成分.
圖像高斯金字塔實際上是一種圖像的尺度空間(分線性和非線性空間,此處僅討論線性空間),尺度的概念用來模擬觀察者距離物體的遠(yuǎn)近程度,在模擬物體遠(yuǎn)近的同時,還得考慮物體的粗細(xì)程序.
綜上,圖像的尺度空間是模擬人眼看到物體的遠(yuǎn)近程度以及模糊程度.
圖像高斯金字塔就考慮了這兩個方面:① 圖像的遠(yuǎn)近程度;② 圖像的模糊程度(理解為粗細(xì)更好).
那該怎么模擬圖像的遠(yuǎn)近程度呢?
采樣法(上采樣,下采樣)
比如一幅圖像,對于每一行,隔一個像素點(diǎn)取一個像素點(diǎn),那么最后得到的圖像就是原圖像的行和列各1/2. 這屬于下采樣的一種.
那該怎么模擬圖像的粗細(xì)程序呢?
采用高斯核對圖像進(jìn)行平滑處理,因為高斯卷積核是實現(xiàn)尺度變換的唯一線性核.
上面,我們從一個感性的角度去理解高斯金字塔的形成過程,現(xiàn)在我們來理性分析高斯金字塔的創(chuàng)建過程。
高斯金字塔式在Sift算子中提出來的概念,首先高斯金字塔并不是一個金字塔,而是有很多組(Octave)金字塔構(gòu)成,并且每組金字塔都包含若干層(Interval)。
高斯金字塔構(gòu)建過程:
先將原圖像擴(kuò)大一倍之后作為高斯金字塔的第1組第1層,將第1組第1層圖像經(jīng)高斯卷積(其實就是高斯平滑或稱高斯濾波)之后作為第1組金字塔的第2層,高斯卷積函數(shù)為:
對于參數(shù)σ,在Sift算子中取的是固定值1.6。
將σ乘以一個比例系數(shù)k,等到一個新的平滑因子σ=k*σ,用它來平滑第1組第2層圖像,結(jié)果圖像作為第3層。
如此這般重復(fù),最后得到L層圖像,在同一組中,每一層圖像的尺寸都是一樣的,只是平滑系數(shù)不一樣。它們對應(yīng)的平滑系數(shù)分別為:0,σ,kσ,k2σ,k3σ……k^(L-2)σ。
將第1組倒數(shù)第三層圖像作比例因子為2的降采樣,得到的圖像作為第2組的第1層,然后對第2組的第1層圖像做平滑因子為σ的高斯平滑,得到第2組的第2層,就像步驟2中一樣,如此得到第2組的L層圖像,同組內(nèi)它們的尺寸是一樣的,對應(yīng)的平滑系數(shù)分別為:0,σ,kσ,k2σ,k3σ……k^(L-2)σ。但是在尺寸方面第2組是第1組圖像的一半。
這樣反復(fù)執(zhí)行,就可以得到一共O組,每組L層,共計O*L個圖像,這些圖像一起就構(gòu)成了高斯金字塔,結(jié)構(gòu)如下:
在同一組內(nèi),不同層圖像的尺寸是一樣的,后一層圖像的高斯平滑因子σ是前一層圖像平滑因子的k倍;
在不同組內(nèi),后一組第一個圖像是前一組倒數(shù)第三個圖像的二分之一采樣,圖像大小是前一組的一半;
高斯金字塔圖像效果如下,分別是第1組的4層和第2組的4層:
3.3高斯金字塔創(chuàng)建總圖
其中
式(1)中,M 為原始圖像的行高;N 為原始圖像的列寬;O 為圖像高斯金字塔的組數(shù).
式(2)中,n 為待提取圖像特征的圖像數(shù);S 為圖像高斯金字塔每組的層數(shù).
為了方便計算,從0開始記錄組數(shù)或?qū)訑?shù)
(3)中,o 為組索引序號,r 為層索引序號,σ (o, r ) 為對應(yīng)的圖像的高斯模糊系數(shù).
σ0σ_0σ0?為高斯模糊初始值,David G.Lowe 教授剛開始設(shè)置為1.6,考慮相機(jī)實際已對圖像進(jìn)行σ=0.5的模糊處理,故實際:
通過式(3),可以計算對應(yīng)圖像金字塔中的高斯模糊系數(shù),如下:
第0組,第0層:
第0組,第1層:
第0組,第2層:
…
…
第1組,第0層:
第1組,第1層:
第1組,第2層:
…
…
第2組,第0層:
第2組,第1層:
第2組,第2層:
…
…
由上述計算,我們知道
① 每一組內(nèi),相鄰層之間的高斯模糊系統(tǒng)相差 21/n2^{1/n}21/n;
② 第0組第0層,第1組第第0層,第2組第0層,…,的高斯模糊系數(shù)分別為σ0,2σ0,4σ0,...σ_0,2σ_0,4σ_0,...σ0?,2σ0?,4σ0?,... ;
③ 下一組的第0層為上一組倒數(shù)第3層降采樣所得,無須進(jìn)行高斯模糊操作.
總的過程,如圖2所示:
四、尺度空間
圖像的尺度空間解決的問題是如何對圖像在所有尺度下描述的問題。
在高斯金字塔中一共生成O組L層不同尺度的圖像,這兩個量合起來(O,L)就構(gòu)成了高斯金字塔的尺度空間,也就是說以高斯金字塔的組O作為二維坐標(biāo)系的一個坐標(biāo),不同層L作為另一個坐標(biāo),則給定的一組坐標(biāo)(O,L)就可以唯一確定高斯金字塔中的一幅圖像。
尺度空間的形象表述:
上圖中尺度空間中k前的系數(shù)n表示的是第一組圖像尺寸是當(dāng)前組圖像尺寸的n倍
五、高斯差分金字塔
創(chuàng)建好圖像高斯金字塔后,每一組內(nèi)的相鄰層相減可以得到高斯差分金字塔(DoG, Difference of Gaussian),是后期檢測圖像極值點(diǎn)的前提,如圖2所示:
DOG金字塔的第1組第1層是由高斯金字塔的第1組第2層減第1組第1層得到的。以此類推,逐組逐層生成每一個差分圖像,所有差分圖像構(gòu)成差分金字塔。概括為DOG金字塔的第o組第l層圖像是有高斯金字塔的第o組第l+1層減第o組第l層得到的。
每一組在層數(shù)上,DOG金字塔比高斯金字塔少一層。后續(xù)Sift特征點(diǎn)的提取都是在DOG金字塔上進(jìn)行的。
DOG金字塔的顯示效果如下:
下邊對這些DOG圖像進(jìn)行歸一化,可有很明顯的看到差分圖像所蘊(yùn)含的特征,并且有一些特征是在不同模糊程度、不同尺度下都存在的,這些特征正是Sift所要提取的“穩(wěn)定”特征:
5.1極值點(diǎn)(Key points)的精確定位
閾值化
其中,T = 0.04,可人為設(shè)定其值;n為待提取特征的圖像數(shù);abs(val)為圖像的像素值. 設(shè)定像素閾值,為了去除一些噪點(diǎn)或其它一些不穩(wěn)定像素點(diǎn).
在高斯差分金字塔中尋找極值點(diǎn)
特征點(diǎn)是由DOG空間的局部極值點(diǎn)組成的。為了尋找DoG函數(shù)的極值點(diǎn),每一個像素點(diǎn)要和它所有的相鄰點(diǎn)比較,看其是否比它的圖像域和尺度域的相鄰點(diǎn)大或者小。
如下圖所示:在高斯差分金字塔中尋找極值點(diǎn),除了考慮x,y方向的點(diǎn),還要考慮σ 方向的點(diǎn),所以判斷一個像素點(diǎn)是否為極值點(diǎn),要與周圍的26個點(diǎn)進(jìn)行比較.
注:
① 如果高斯差分金字塔每組有3層,則只能在中間1層圖像尋 找極值點(diǎn),
兩端的圖像不連續(xù),沒有極值點(diǎn).
② 如果高斯差分金字塔每組有5層,則只能在中間3層圖像尋找極值點(diǎn).
依此類推…
當(dāng)我們檢測到極值點(diǎn)之后,會發(fā)現(xiàn)一個問題,高斯差分金字塔是離散的(因為尺度空間和像素點(diǎn)都是離散的),所以找到的極值點(diǎn)不太準(zhǔn)確的,很大可能在真正極值點(diǎn)附近,如圖4所示,為了找到更高亞像素位置精度的極值點(diǎn),需利用泰勒展開式.
更正極值點(diǎn)位置
在檢測到的極值點(diǎn)處,作三元二階泰勒展開:
f(x)對x進(jìn)行求導(dǎo):
令導(dǎo)數(shù)為零
帶入f(x),可得
注:
上述求解的結(jié)束標(biāo)志:達(dá)到一定的迭代次數(shù).
求解亞像素精度極值點(diǎn)時,當(dāng)所得解超出離散極值點(diǎn)一定范圍舍去,
因為泰勒展開只是在離散點(diǎn)附近能夠較好的擬合原函數(shù).
舍去低對比度的點(diǎn)
若|f(x)|<T/n,則舍去點(diǎn)X
去除邊緣效應(yīng)
本質(zhì)上要去掉DoG局部曲率非常不對稱的像素. 一個定義不好的高斯差分算子的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。主曲率通過一個2×2的海森矩陣(Hessian Matrix)H求出,D的主曲率和H的特征值成正比,令α 為較大特征值,β 為較小的特征值.
注:最終得到像素點(diǎn)坐標(biāo)(x,y)可以不是整數(shù),σ可以不是在高斯金字塔的某一層上.
5.2確定關(guān)鍵點(diǎn)(極值點(diǎn))方向
1、通過尺度不變性求極值點(diǎn),需要利用圖像的局部特征為給每一個關(guān)鍵點(diǎn)分配一個基準(zhǔn)方向,使描述子對圖像旋轉(zhuǎn)具有不變性。對于在DOG金字塔中檢測出的關(guān)鍵點(diǎn),采集其所在高斯金字塔圖像3σ鄰域窗口內(nèi)像素的梯度和方向分布特征。梯度的模值和方向如下:
2、本算法采用梯度直方圖統(tǒng)計法,統(tǒng)計以關(guān)鍵點(diǎn)為原點(diǎn),一定區(qū)域內(nèi)的圖像像素點(diǎn)確定關(guān)鍵點(diǎn)方向。在完成關(guān)鍵點(diǎn)的梯度計算后,使用直方圖統(tǒng)計鄰域內(nèi)像素的梯度和方向。梯度直方圖將0~360度的方向范圍分為36個柱,其中每柱10度。如下圖所示,直方圖的峰值方向代表了關(guān)鍵點(diǎn)的主方向,方向直方圖的峰值則代表了該特征點(diǎn)處鄰域梯度的方向,以直方圖中最大值作為該關(guān)鍵點(diǎn)的主方向。為了增強(qiáng)匹配的魯棒性,只保留峰值大于主方向峰值80%的方向作為該關(guān)鍵點(diǎn)的輔方向。
統(tǒng)計以特征點(diǎn)為圓心,以該特征點(diǎn)所在的高斯圖像的尺度的1.5倍為半徑的圓內(nèi)的所有的像素的梯度方向及其梯度幅值,并做1.5σ的高斯濾波(高斯加權(quán),離圓心也就是關(guān)鍵點(diǎn)近的幅值所占權(quán)重較高).
5.3關(guān)鍵點(diǎn)描述
上述過程,只是找到關(guān)鍵點(diǎn)并確定了其方向,但SIFT算法核心用途在于圖像的匹配,我們需要對關(guān)鍵點(diǎn)進(jìn)行數(shù)學(xué)層面的特征描述,也就是構(gòu)建關(guān)鍵點(diǎn)描述符.
1、確定計算描述子所需的圖像區(qū)域
描述子梯度方向直方圖由關(guān)鍵點(diǎn)所在尺度的高斯圖像計算產(chǎn)生. 圖像區(qū)域的半徑通過下式(17)計算:
d=4,代表劃分4x4個子塊
2、將坐標(biāo)移到關(guān)鍵點(diǎn)方向
關(guān)鍵點(diǎn)所在的半徑區(qū)域,移至關(guān)鍵點(diǎn)方向,如下圖所示
3、生成關(guān)鍵點(diǎn)描述符
將區(qū)域劃分為4x4的子塊,對每一個子塊進(jìn)行8個方向的直方圖統(tǒng)計操作,獲得每個方向的梯度幅值,總共可以組成128維描述向量。
對于每一個關(guān)鍵點(diǎn),都擁有位置、尺度以及方向三個信息。為每個關(guān)鍵點(diǎn)建立一個描述符,用一組向量將這個關(guān)鍵點(diǎn)描述出來,使其不隨各種變化而改變,比如光照變化、視角變化等等。這個描述子不但包括關(guān)鍵點(diǎn),也包含關(guān)鍵點(diǎn)周圍對其有貢獻(xiàn)的像素點(diǎn),并且描述符應(yīng)該有較高的獨(dú)特性,以便于提高特征點(diǎn)正確匹配的概率。
實驗表明:描述子采用4x4x8=128維向量表示,效果最優(yōu)
5.4關(guān)鍵點(diǎn)匹配
1、分別對模板圖(參考圖,reference image)和實時圖(觀測圖,observation image)建立關(guān)鍵點(diǎn)描述子集合。目標(biāo)的識別是通過兩點(diǎn)集內(nèi)關(guān)鍵點(diǎn)描述子的比對來完成。具有128維的關(guān)鍵點(diǎn)描述子的相似性度量采用歐式距離。
2、匹配可采取窮舉法完成,但所花費(fèi)的時間太多。所以一般采用kd樹的數(shù)據(jù)結(jié)構(gòu)來完成搜索。搜索的內(nèi)容是以目標(biāo)圖像的關(guān)鍵點(diǎn)為基準(zhǔn),搜索與目標(biāo)圖像的特征點(diǎn)最鄰近的原圖像特征點(diǎn)和次鄰近的原圖像特征點(diǎn)。
Kd樹如下如所示,是個平衡二叉樹
六、sift代碼
import cv2 import numpy as np import matplotlib.pyplot as plt#1、讀取圖像 img=cv2.imread('cat.jpg') cat=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#2、sift關(guān)鍵點(diǎn)檢測 #sift實例化對象 sift=cv2.xfeatures2d.SIFT_create()# 2.2關(guān)鍵點(diǎn)檢測:kp關(guān)鍵點(diǎn)信息包括方向,尺度,位置信息,des是關(guān)鍵點(diǎn)的描述符 kp,des=sift.detectAndCompute(cat,None)# 2.3在圖像上繪制關(guān)鍵點(diǎn)的檢測結(jié)果 cv2.drawKeypoints(img,kp,img,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)#3圖像顯示 plt.figure(figsize=(8,6),dpi=100) plt.imshow(img[:,:,::-1]),plt.title('sift') plt.xticks([]),plt.yticks([]) plt.show()七、總結(jié)
SIFT特征具有穩(wěn)定性和不變性,在圖像處理和計算機(jī)視覺領(lǐng)域有著很重要的作用,其本身也是非常復(fù)雜的,由于接觸SIFT不是很久,對其中的相關(guān)知識了解還很不足,經(jīng)多方查閱參考,寫得此文,內(nèi)容還不夠詳盡,望多多見諒。以下是SIFT算法的粗略總結(jié)。
1、DoG尺度空間的極值檢測。
2、刪除不穩(wěn)定的極值點(diǎn)。
3、確定特征點(diǎn)的主方向
4、生成特征點(diǎn)的描述子進(jìn)行關(guān)鍵點(diǎn)匹配。
參考文章
https://blog.csdn.net/qq_37374643/article/details/88606351
https://zhuanlan.zhihu.com/p/343522892?ivk_sa=1024320u
總結(jié)
以上是生活随笔為你收集整理的全网最详细SIFT算法原理实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gvim for php,转 : Gvi
- 下一篇: 树莓派Raspberry pi 4B 运