OpenCV图像特征提取学习四,SIFT特征检测算法
一、SIFT特征檢測(cè)概述?
SIFT的全稱是Scale Invariant Feature Transform,尺度不變特征變換,由加拿大教授David G.Lowe提出的。SIFT特征具有對(duì)旋轉(zhuǎn)、尺度縮放、亮度變化等保持不變性,是一種非常穩(wěn)定的局部特征。
1.1 SIFT算法具的特點(diǎn)
1.2 SIFT特征檢測(cè)的步驟
================================================================
二、高斯核構(gòu)建尺度空間
通過圖像的模糊程度來(lái)模擬人在距離物體由遠(yuǎn)到近時(shí)物體在視網(wǎng)膜上成像過程,距離物體越近其尺寸越大圖像也越模糊,這就是高斯尺度空間,使用不同的參數(shù)模糊圖像(分辨率不變),是尺度空間的另一種表現(xiàn)形式。
我們知道圖像和高斯函數(shù)進(jìn)行卷積運(yùn)算能夠?qū)D像進(jìn)行模糊,使用不同的“高斯核”可得到不同模糊程度的圖像。一副圖像其高斯尺度空間可由其和不同的高斯卷積得到:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中,是高斯核函數(shù):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
稱為尺度空間因子,它是高斯正態(tài)分布的標(biāo)準(zhǔn)差,反映了圖像被模糊的程度,其值越大圖像越模糊,對(duì)應(yīng)的尺度也就越大。代表著圖像的高斯尺度空間。
構(gòu)建尺度空間的目的是為了檢測(cè)出在不同的尺度下都存在的特征點(diǎn),而檢測(cè)特征點(diǎn)較好的算子是高斯拉普拉斯算子?(LoG)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
設(shè)kk為相鄰兩個(gè)高斯尺度空間的比例因子,則DoG的定義:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
將相鄰的兩個(gè)高斯空間的圖像相減就得到了DoG的響應(yīng)圖像。為了得到DoG圖像,先要構(gòu)建高斯尺度空間,而高斯的尺度空間可以在圖像金字塔降采樣的基礎(chǔ)上加上高斯濾波得到,也就是對(duì)圖像金字塔的每層圖像使用不同的參數(shù)σσ進(jìn)行高斯模糊,使每層金字塔有多張高斯模糊過的圖像。降采樣時(shí),金字塔上邊一組圖像的第一張是由其下面一組圖像倒數(shù)第三張降采樣得到。
高斯金字塔有多組,每組又有多層。一組中的多個(gè)層之間的尺度是不一樣的(也就是使用的高斯參數(shù)σ是不同的),相鄰兩層之間的尺度相差一個(gè)比例因子k。如果每組有S層,則。上一組圖像的最底層圖像是由下一組中尺度為2σ的圖像進(jìn)行因子為2的降采樣得到的(高斯金字塔先從底層建立)。高斯金字塔構(gòu)建完成后,將相鄰的高斯金字塔相減就得到了DoG金字塔。
高斯金字塔的組數(shù)一般是
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
o表示高斯金字塔的層數(shù),m,n分別是圖像的行和列。減去的系數(shù)a可以在之間的任意值,和具體需要的金字塔的頂層圖像的大小有關(guān)。
高斯模糊參數(shù)(尺度空間),可由下面關(guān)系式得到:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中o為所在的組,s為所在的層,為初始的尺度,S為每組的層數(shù)。算法實(shí)現(xiàn)中,就是首先將原圖像的長(zhǎng)和寬各擴(kuò)展一倍。S=3,從這里可以得知同一組內(nèi)相鄰層的圖像尺度關(guān)系:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
相鄰組之間的尺度關(guān)系:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
=================================================================
三、DoG空間極值檢測(cè)
為了尋找尺度空間的極值點(diǎn),每個(gè)像素點(diǎn)要和其圖像域(同一尺度空間)和尺度域(相鄰的尺度空間)的所有相鄰點(diǎn)進(jìn)行比較,當(dāng)其大于(或者小于)所有相鄰點(diǎn)時(shí),改點(diǎn)就是極值點(diǎn)。如圖所示,中間的檢測(cè)點(diǎn)要和其所在圖像的3×3鄰域8個(gè)像素點(diǎn),以及其相鄰的上下兩層的3×3領(lǐng)域18個(gè)像素點(diǎn),共26個(gè)像素點(diǎn)進(jìn)行比較。
從上面的描述中可以知道,每組圖像的第一層和最后一層是無(wú)法進(jìn)行比較取得極值的。為了滿足尺度變換的連續(xù)性,在每一組圖像的頂層繼續(xù)使用高斯模糊生成3幅圖像,高斯金字塔每組有S+3層圖像,DoG金字塔的每組有S+2組圖像。
設(shè)S=3,也就是每組有3層,則,也就是有高斯金字塔每組有(S?1)3層圖像,DoG金字塔每組有(S?1)3層圖像,DoG金字塔每組有(S-2)2層圖像。在DoG金字塔的第一組有兩層尺度分別是σ,kσ,第二組有兩層的尺度分別是2σ,2kσ,由于只有兩項(xiàng)是無(wú)法比較取得極值的(只有左右兩邊都有值才能有極值)。
由于無(wú)法比較取得極值,那么我們就需要繼續(xù)對(duì)每組的圖像進(jìn)行高斯模糊,使得尺度形成,這樣就可以選擇中間的三項(xiàng)。對(duì)應(yīng)的下一組由上一組降采樣得到的三項(xiàng)是,其首項(xiàng),剛好與上一組的最后一項(xiàng)的尺度連續(xù)起來(lái)。
=====================================================
四、刪除不好的極值點(diǎn)(特征點(diǎn))
通過比較檢測(cè)得到的DoG的局部極值點(diǎn)實(shí)在離散的空間搜索得到的,由于離散空間是對(duì)連續(xù)空間采樣得到的結(jié)果,因此在離散空間找到的極值點(diǎn)不一定是真正意義上的極值點(diǎn),因此要設(shè)法將不滿足條件的點(diǎn)剔除掉。可以通過尺度空間DoG函數(shù)進(jìn)行曲線擬合尋找極值點(diǎn),這一步的本質(zhì)是去掉DoG局部曲率非常不對(duì)稱的點(diǎn)。
要剔除掉的不符合要求的點(diǎn)主要有兩種:
- 低對(duì)比度的特征點(diǎn)
- 不穩(wěn)定的邊緣響應(yīng)點(diǎn)
?1.剔除低對(duì)比度的特征點(diǎn)
候選特征點(diǎn)x,其偏移量定義為,其對(duì)比度為H(x),其絕對(duì)值∣H(x)∣,對(duì)H(x)應(yīng)用泰勒展開式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
由于x是H(x)的極值點(diǎn),所以對(duì)上式求導(dǎo)并令其為0,得到
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
?然后再把求得的代入到H(x)的泰勒展開式中:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?設(shè)對(duì)比度的閾值為T,若,則該特征點(diǎn)保留,否則剔除掉。
2.剔除不穩(wěn)定的邊緣響應(yīng)點(diǎn)?
在邊緣梯度的方向上主曲率值比較大,而沿著邊緣方向則主曲率值較小。候選特征點(diǎn)的DoG函數(shù)H(x)的主曲率與3×3的Hessian矩陣HH的特征值成正比。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
其中,是候選點(diǎn)鄰域?qū)?yīng)位置的差分求得的。為了避免求具體的值,可以使用H特征值得比例。設(shè)為H的最大特征值,為H的最小特征值。可以得到:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中,為矩陣H的跡,為矩陣H的行列式。設(shè)表示最大特征值和最小特征值的比值,則:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
上式的結(jié)果與兩個(gè)特征值的比例有關(guān),和具體的大小無(wú)關(guān),當(dāng)兩個(gè)特征值想等時(shí)其值最小,并且隨著γγ的增大而增大。因此為了檢測(cè)主曲率是否在某個(gè)閾值下,只需檢測(cè):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?
如果上式成立,則剔除該特征點(diǎn),否則保留。
=========================================================================
五、求取特征點(diǎn)的主方向
經(jīng)過上面的步驟已經(jīng)找到了在不同尺度下都存在的特征點(diǎn),為了實(shí)現(xiàn)圖像旋轉(zhuǎn)不變性,需要給特征點(diǎn)的方向進(jìn)行賦值。利用特征點(diǎn)鄰域像素的梯度分布特性來(lái)確定其方向參數(shù),再利用圖像的梯度直方圖求取關(guān)鍵點(diǎn)局部結(jié)構(gòu)的穩(wěn)定方向。找到了特征點(diǎn),也就可以得到該特征點(diǎn)的尺度,也就可以得到特征點(diǎn)所在的尺度圖像.
?計(jì)算以特征點(diǎn)為中心、以3×1.5為半徑的區(qū)域圖像的幅角和幅值,為了防御噪聲的干擾,計(jì)算得到圓形區(qū)域內(nèi)所有點(diǎn)的梯度大小與方向之后,以極值點(diǎn)為中心,以1.5σ為高斯分布的標(biāo)準(zhǔn)差,對(duì)圓形區(qū)域內(nèi)所有點(diǎn)的梯度大小進(jìn)行高斯加權(quán)(越靠近中心點(diǎn)權(quán)重越大):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
每個(gè)點(diǎn)的梯度的模以及方向可以通過以下公式求得:
計(jì)算得到梯度方向后,就要使用直方圖統(tǒng)計(jì)特征點(diǎn)鄰域內(nèi)像素對(duì)應(yīng)的梯度方向和幅值。梯度方向的直方圖的橫軸是梯度方向的角度(梯度方向的范圍是0到360度,直方圖每36度一個(gè)柱共10個(gè)柱,或者每45度一個(gè)柱共8個(gè)柱),縱軸是梯度方向?qū)?yīng)梯度賦值的累加。
為了到更精確的方向,通常還可以對(duì)離散的梯度直方圖進(jìn)行插值擬合。具體而言,關(guān)鍵點(diǎn)的方向可以由和主峰值最近的三個(gè)柱值通過拋物線插值得到。在梯度直方圖中,當(dāng)存在一個(gè)相當(dāng)于主峰值80%能量的柱值時(shí),則可以將這個(gè)方向認(rèn)為是該特征點(diǎn)輔助方向,一個(gè)特征值可以檢測(cè)到多個(gè)方向。
得到特征點(diǎn)的主方向后,對(duì)于每個(gè)特征點(diǎn)可以得到三個(gè)信息,即位置、尺度和方向。由此可以確定一個(gè)SIFT特征區(qū)域,一個(gè)SIFT特征區(qū)域由三個(gè)值表示,中心表示特征點(diǎn)位置,半徑表示關(guān)鍵點(diǎn)的尺度,箭頭表示主方向。具有多個(gè)方向的關(guān)鍵點(diǎn)可以被復(fù)制成多份,然后將方向值分別賦給復(fù)制后的特征點(diǎn),一個(gè)特征點(diǎn)就產(chǎn)生了多個(gè)坐標(biāo)、尺度相等,但是方向不同的特征點(diǎn)。
=========================================================================?
六、生成特征描述
通過以上的步驟已經(jīng)找到了SIFT特征點(diǎn)位置、尺度和方向信息,下面就需要使用一組向量來(lái)描述關(guān)鍵點(diǎn)也就是生成特征點(diǎn)描述子,這個(gè)描述符不只包含特征點(diǎn),也含有特征點(diǎn)周圍對(duì)其有貢獻(xiàn)的像素點(diǎn)。描述子應(yīng)具有較高的獨(dú)立性,以保證匹配率。
特征描述符的生成大致有三個(gè)步驟:
為了保證特征矢量的旋轉(zhuǎn)不變性,要以特征點(diǎn)為中心,在附近鄰域內(nèi)將坐標(biāo)軸旋轉(zhuǎn)θθ(特征點(diǎn)的主方向)角度,即將坐標(biāo)軸旋轉(zhuǎn)為特征點(diǎn)的主方向。旋轉(zhuǎn)后鄰域內(nèi)像素的新坐標(biāo)為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
旋轉(zhuǎn)后以主方向?yàn)橹行娜?8×8的窗口。下圖所示,左圖的中央為當(dāng)前關(guān)鍵點(diǎn)的位置,每個(gè)小格代表為關(guān)鍵點(diǎn)鄰域所在尺度空間的一個(gè)像素,求取每個(gè)像素的梯度幅值與梯度方向,箭頭方向代表該像素的梯度方向,長(zhǎng)度代表梯度幅值,然后利用高斯窗口對(duì)其進(jìn)行加權(quán)運(yùn)算。最后在每個(gè)4×4的小塊上繪制8個(gè)方向的梯度直方圖,計(jì)算每個(gè)梯度方向的累加值,即可形成一個(gè)種子點(diǎn),如右圖所示。每個(gè)特征點(diǎn)由4個(gè)種子點(diǎn)組成,每個(gè)種子點(diǎn)有8個(gè)方向的向量信息。這種鄰域方向性信息聯(lián)合增強(qiáng)了算法的抗噪聲能力,同時(shí)對(duì)于含有定位誤差的特征匹配也提供了比較理性的容錯(cuò)性。
與求主方向不同,此時(shí)每個(gè)種子區(qū)域的梯度直方圖在0-360之間劃分為8個(gè)方向區(qū)間,每個(gè)區(qū)間為45度,即每個(gè)種子點(diǎn)有8個(gè)方向的梯度強(qiáng)度信息。對(duì)每個(gè)關(guān)鍵點(diǎn)使用4×4共16個(gè)種子點(diǎn)來(lái)描述,這樣一個(gè)關(guān)鍵點(diǎn)就可以產(chǎn)生128維的SIFT特征向量。
=========================================================================
代碼實(shí)現(xiàn):
#include"stdafx.h" #include <opencv2/opencv.hpp> #include <iostream> #include "math.h"#include <opencv2/features2d.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv; using namespace std; //using namespace cv::features2d;int main(int argc, char** argv) {Mat src = imread("F:/photo/i.jpg", IMREAD_GRAYSCALE);if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input image", WINDOW_AUTOSIZE);imshow("input image", src);int numFeatures = 400;Ptr<SIFT> detector = SIFT::create(numFeatures);vector<KeyPoint> keypoints;detector->detect(src, keypoints, Mat());printf("Total KeyPoints : %d\n", keypoints.size());Mat keypoint_img;drawKeypoints(src, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT);namedWindow("SIFT KeyPoints", WINDOW_AUTOSIZE);imshow("SIFT KeyPoints", keypoint_img);waitKey(0);return 0; }效果實(shí)現(xiàn):
總結(jié)
以上是生活随笔為你收集整理的OpenCV图像特征提取学习四,SIFT特征检测算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java+Ssm在线信访管理系统spri
- 下一篇: QT中Json的使用方法(类和json字