更新時(shí)間:2021年06月03日18時(shí)27分 來源:傳智教育 瀏覽次數(shù):
前面我們介紹了Harris和Shi-Tomasi角點(diǎn)檢測算法,這兩種算法具有旋轉(zhuǎn)不變性,但不具有尺度不變性,以下圖為例,在左側(cè)小圖中可以檢測到角點(diǎn),但是圖像被放大后,在使用同樣的窗口,就檢測不到角點(diǎn)了。
所以,下面我們來介紹一種計(jì)算機(jī)視覺的算法,尺度不變特征轉(zhuǎn)換即SIFT (Scale-invariant feature transform)。它用來偵測與描述影像中的局部性特征,它在空間尺度中尋找極值點(diǎn),并提取出其位置、尺度、旋轉(zhuǎn)不變量,此算法由 David Lowe在1999年所發(fā)表,2004年完善總結(jié)。應(yīng)用范圍包含物體辨識、機(jī)器人地圖感知與導(dǎo)航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動(dòng)作比對等領(lǐng)域。
Lowe將SIFT算法分解為如下四步:
我們就沿著Lowe的步驟,對SIFT算法的實(shí)現(xiàn)過程進(jìn)行介紹:
在不同的尺度空間是不能使用相同的窗口檢測極值點(diǎn),對小的關(guān)鍵點(diǎn)使用小的窗口,對大的關(guān)鍵點(diǎn)使用大的窗口,為了達(dá)到上述目的,我們使用尺度空間濾波器。
高斯核是唯一可以產(chǎn)生多尺度空間的核函數(shù)。-《Scale-space theory: A basic tool for analysing structures at different scales》。
其中: 是尺度空間因子,它決定了圖像的模糊的程度。在大尺度下(值大)表現(xiàn)的是圖像的概貌信息,在小尺度下(值?。┍憩F(xiàn)的是圖像的細(xì)節(jié)信息。
搜索過程從每組的第二層開始,以第二層為當(dāng)前層,對第二層的DoG圖像中的每個(gè)點(diǎn)取一個(gè)3×3的立方體,立方體上下層為第一層與第三層。這樣,搜索得到的極值點(diǎn)既有位置坐標(biāo)(DoG的圖像坐標(biāo)),又有空間尺度坐標(biāo)(層坐標(biāo))。當(dāng)?shù)诙铀阉魍瓿珊螅僖缘谌龑幼鳛楫?dāng)前層,其過程與第二層的搜索類似。當(dāng)S=3時(shí),每組里面要搜索3層,所以在DOG中就有S+2層,在初使構(gòu)建的金字塔中每組有S+3層。
由于DoG對噪聲和邊緣比較敏感,因此在上面高斯差分金字塔中檢測到的局部極值點(diǎn)需經(jīng)過進(jìn)一步的檢驗(yàn)才能精確定位為特征點(diǎn)。
使用尺度空間的泰勒級數(shù)展開來獲得極值的準(zhǔn)確位置, 如果極值點(diǎn)的 灰度值小于閾值(一般為0.03或0.04)就會(huì)被忽略掉。 在 OpenCV 中這種閾值被稱為 contrastThreshold。
DoG 算法對邊界非常敏感, 所以我們必須要把邊界去除。 Harris 算法除了可以用于角點(diǎn)檢測之外還可以用于檢測邊界。從 Harris 角點(diǎn)檢測的算法中,當(dāng)一個(gè)特征值遠(yuǎn)遠(yuǎn)大于另外一個(gè)特征值時(shí)檢測到的是邊界。那在DoG算法中欠佳的關(guān)鍵點(diǎn)在平行邊緣的方向有較大的主曲率,而在垂直于邊緣的方向有較小的曲率,兩者的比值如果高于某個(gè)閾值(在OpenCV中叫做邊界閾值),就認(rèn)為該關(guān)鍵點(diǎn)為邊界,將被忽略,一般將該閾值設(shè)置為10。
將低對比度和邊界的關(guān)鍵點(diǎn)去除,得到的就是我們感興趣的關(guān)鍵點(diǎn)。
經(jīng)過上述兩個(gè)步驟,圖像的關(guān)鍵點(diǎn)就完全找到了,這些關(guān)鍵點(diǎn)具有尺度不變性。為了實(shí)現(xiàn)旋轉(zhuǎn)不變性,還需要為每個(gè)關(guān)鍵點(diǎn)分配一個(gè)方向角度,也就是根據(jù)檢測到的關(guān)鍵點(diǎn)所在高斯尺度圖像的鄰域結(jié)構(gòu)中求得一個(gè)方向基準(zhǔn)。
對于任一關(guān)鍵點(diǎn),我們采集其所在高斯金字塔圖像以r為半徑的區(qū)域內(nèi)所有像素的梯度特征(幅值和幅角),半徑r為: 其中σ是關(guān)鍵點(diǎn)所在octave的圖像的尺度,可以得到對應(yīng)的尺度圖像。
梯度的幅值和方向的計(jì)算公式為:
獲得圖像關(guān)鍵點(diǎn)主方向后,每個(gè)關(guān)鍵點(diǎn)有三個(gè)信息(x,y,σ,θ):位置、尺度、方向。由此我們可以確定一個(gè)SIFT特征區(qū)域。通常使用一個(gè)帶箭頭的圓或直接使用箭頭表示SIFT區(qū)域的三個(gè)值:中心表示特征點(diǎn)位置,半徑表示關(guān)鍵點(diǎn)尺度,箭頭表示方向。如下圖所示:
通過以上步驟,每個(gè)關(guān)鍵點(diǎn)就被分配了位置,尺度和方向信息。接下來我們?yōu)槊總€(gè)關(guān)鍵點(diǎn)建立一個(gè)描述符,該描述符既具有可區(qū)分性,又具有對某些變量的不變性,如光照,視角等。而且描述符不僅僅包含關(guān)鍵點(diǎn),也包括關(guān)鍵點(diǎn)周圍對其有貢獻(xiàn)的的像素點(diǎn)。主要思路就是通過將關(guān)鍵點(diǎn)周圍圖像區(qū)域分塊,計(jì)算塊內(nèi)的梯度直方圖,生成具有特征向量,對圖像信息進(jìn)行抽象。
描述符與特征點(diǎn)所在的尺度有關(guān),所以我們在關(guān)鍵點(diǎn)所在的高斯尺度圖像上生成對應(yīng)的描述符。以特征點(diǎn)為中心,將其附近鄰域劃分為個(gè)子區(qū)域(一般取d=4),每個(gè)子區(qū)域都是一個(gè)正方形,邊長為3σ,考慮到實(shí)際計(jì)算時(shí),需進(jìn)行三次線性插值,所以特征點(diǎn)鄰域的為的范圍,如下圖所示:
為了保證特征點(diǎn)的旋轉(zhuǎn)不變性,以特征點(diǎn)為中心,將坐標(biāo)軸旋轉(zhuǎn)為關(guān)鍵點(diǎn)的主方向,如下圖所示:
計(jì)算子區(qū)域內(nèi)的像素的梯度,并按照σ=0.5d進(jìn)行高斯加權(quán),然后插值計(jì)算得到每個(gè)種子點(diǎn)的八個(gè)方向的梯度,插值方法如下圖所示:
每個(gè)種子點(diǎn)的梯度都是由覆蓋其的4個(gè)子區(qū)域插值而得的。如圖中的紅色點(diǎn),落在第0行和第1行之間,對這兩行都有貢獻(xiàn)。對第0行第3列種子點(diǎn)的貢獻(xiàn)因子為dr,對第1行第3列的貢獻(xiàn)因子為1-dr,同理,對鄰近兩列的貢獻(xiàn)因子為dc和1-dc,對鄰近兩個(gè)方向的貢獻(xiàn)因子為do和1-do。則最終累加在每個(gè)方向上的梯度大小為: 其中k,m,n為0或?yàn)?。 如上統(tǒng)計(jì)個(gè)梯度信息即為該關(guān)鍵點(diǎn)的特征向量,按照特征點(diǎn)的對每個(gè)關(guān)鍵點(diǎn)的特征向量進(jìn)行排序,就得到了SIFT特征描述向量。
SIFT在圖像的不變特征提取方面擁有無與倫比的優(yōu)勢,但并不完美,仍然存在實(shí)時(shí)性不高,有時(shí)特征點(diǎn)較少,對邊緣光滑的目標(biāo)無法準(zhǔn)確提取特征點(diǎn)等缺陷,自SIFT算法問世以來,人們就一直對其進(jìn)行優(yōu)化和改進(jìn),其中最著名的就是SURF算法。
猜你喜歡:
北京校區(qū)