SIFT概述
SIFT特征是非常穩(wěn)定的圖像特征,在圖像搜索、特征匹配、圖像分類檢測等方面應(yīng)用十分廣泛,但是它的缺點(diǎn)也是非常明顯,就是計(jì)算量比較大,很難實(shí)時(shí),所以對一些實(shí)時(shí)要求比較高的常見SIFT算法還是無法適用。
如今SIFT算法在深度學(xué)習(xí)特征提取與分類檢測網(wǎng)絡(luò)大行其道的背景下,已經(jīng)越來越有雞肋的感覺,但是它本身的算法知識還是很值得我們學(xué)習(xí),對我們也有很多有益的啟示,本質(zhì)上SIFT算法是很多常見算法的組合與巧妙銜接,這個(gè)思路對我們自己處理問題可以帶來很多有益的幫助。
特別是SIFT特征涉及到尺度空間不變性與旋轉(zhuǎn)不變性特征,是我們傳統(tǒng)圖像特征工程的兩大利器,可以擴(kuò)展與應(yīng)用到很多圖像特征提取的算法當(dāng)中,比如SURF、HOG、HAAR、LBP等。
夸張一點(diǎn)的說SIFT算法涵蓋了圖像特征提取必備的精髓思想,從特征點(diǎn)的檢測到描述子生成,完成了對圖像的準(zhǔn)確描述,早期的ImageNet比賽中,很多圖像分類算法都是以SIFT與HOG特征為基礎(chǔ),所有SIFT算法還是值得認(rèn)真詳細(xì)解讀一番的。SIFT特征提取歸納起來SIFT特征提取主要有如下幾步:
構(gòu)建高斯多尺度金字塔
關(guān)鍵點(diǎn)精準(zhǔn)定位與過濾
關(guān)鍵點(diǎn)方向指派
描述子生成
構(gòu)建高斯多尺度金字塔
常見的高斯圖像金字塔是每層只有一張圖像,大致如下:
上述的是通過圖像金字塔實(shí)現(xiàn)了多分辨率,如果我們在每一層高斯金字塔圖像生成的時(shí)候,給予不同的sigma值,這樣不同的sigam就會產(chǎn)生不同模糊版本的圖像,在同一層中就是實(shí)現(xiàn)不同尺度的模糊圖像,再結(jié)合高斯金字塔,生成多個(gè)層多個(gè)尺度的金字塔,就是實(shí)現(xiàn)了圖像的多尺度金字塔。同一張圖像不同尺度高斯模糊如下:
為了在每層圖像中檢測 S 個(gè)尺度的極值點(diǎn),DoG 金字塔每層需 S+2 張圖像,因?yàn)槊拷M的第一張和最后一張圖像上不能檢測極值,DoG 金字塔由高斯金字塔相鄰兩張相減得到,則高斯金字塔每層最少需 S+3 張圖像,實(shí)際計(jì)算時(shí) S 通常在2到5之間。SIFT算法中生成高斯金字塔的規(guī)則如下(尺度空間不變性):
關(guān)鍵點(diǎn)精準(zhǔn)定位與過濾
對得到的每層DOG圖像,計(jì)算窗口3x3x3范圍除去中心點(diǎn)之外的26點(diǎn)與中心點(diǎn)比較大小,尋找最大值或者最小值(極值點(diǎn)),如下圖:
即周圍26個(gè)點(diǎn)(青色)要小于或者大于中心像素點(diǎn),這樣就得到初步的極值點(diǎn)候選,然后進(jìn)行亞像素級別的精準(zhǔn)定位。
原因在于圖像得到像素坐標(biāo)是離散的,尺度空間也是離散的間隔,每個(gè)極值點(diǎn)P(x, y, s)三維空間中不一定是真正的連續(xù)空間的極值點(diǎn),以二維的曲線為例,得到藍(lán)色是離散空間極值點(diǎn),實(shí)際極值點(diǎn)是紅色點(diǎn),如下圖所示:
從上圖我們也可以看出,在連續(xù)空間的極值點(diǎn)必然是導(dǎo)數(shù)過零點(diǎn),
對于|D(extremal)| < 0.03可以作為低對比度點(diǎn)或者弱邊緣舍棄。
關(guān)鍵點(diǎn)方向指派
前面我們已經(jīng)詳細(xì)解釋了SIFT特征點(diǎn)是如何提取的,有了特征點(diǎn)之后,我們對特征點(diǎn)周圍的像素塊計(jì)算角度方向直方圖,在計(jì)算直方圖之前首先需要對圖像進(jìn)行梯度計(jì)算,這里可以使用SOBEL算子,然后根據(jù)dx與dy計(jì)算梯度和與角度,這里使用的高斯權(quán)重,所以在梯度之前,首先需要對ROI區(qū)域進(jìn)行高斯模糊,然后再計(jì)算角度(x軸,Bins)-梯度(Y軸)直方圖,直方圖的最高峰(max peak)對應(yīng)的角度就是關(guān)鍵點(diǎn)的角度方向,對于大于max peak*85%的bin也作為方向指派給關(guān)鍵點(diǎn),這樣同一個(gè)關(guān)鍵點(diǎn)因?yàn)橛卸鄠€(gè)方向在描述子生成的時(shí)候就會生成多個(gè)描述子,從而增加了特征的穩(wěn)定性與抗干擾能力。圖示如下:
描述子生成
選擇關(guān)鍵點(diǎn)小區(qū)域,根據(jù)窗口大小不同可以分為4x4大小不同的Cell,每個(gè)Cell生成一個(gè)角度方向直方圖(8個(gè)BIN),對它們進(jìn)行排序以后(旋轉(zhuǎn)不變性描述子),生成128個(gè)向量特征數(shù)據(jù),作為該關(guān)鍵點(diǎn)的唯一描述
根據(jù)排序以后生成描述子的規(guī)則不同,又可以分為
原圖正常順序描述子
水平反射順序描述子
垂直反射順序描述子
如下圖所示:
OpenCV中調(diào)用
OpenCV已經(jīng)實(shí)現(xiàn)了SIFT算法,但是在OpenCV3.0之后因?yàn)閷@跈?quán)問題,該算法在擴(kuò)展模塊xfeature2d中,需要自己編譯才可以使用。
但是在OpenCV4.4之后因?yàn)閷@^期,SIFT算法又回到了正式發(fā)布安裝包中,無需編譯源碼,即可使用!首先需要?jiǎng)?chuàng)建一個(gè)SIFT檢測器對象,通過調(diào)用
通過detect方法提取對象關(guān)鍵點(diǎn)
用drawKeypoints繪制關(guān)鍵點(diǎn)
通過compute提取描述子,
通過暴力匹配根據(jù)描述子匹配
代碼演示如下
importcv2ascv box=cv.imread("D:/images/box.png"); box_in_sence=cv.imread("D:/images/box_in_scene.png"); cv.imshow("box",box) cv.imshow("box_in_sence",box_in_sence) #創(chuàng)建SIFT特征檢測器 sift=cv.xfeatures2d.SIFT_create() #特征點(diǎn)提取與描述子生成 kp1,des1=sift.detectAndCompute(box,None) kp2,des2=sift.detectAndCompute(box_in_sence,None) #暴力匹配 bf=cv.DescriptorMatcher_create(cv.DescriptorMatcher_BRUTEFORCE) matches=bf.match(des1,des2) #繪制最佳匹配 matches=sorted(matches,key=lambdax:x.distance) result=cv.drawMatches(box,kp1,box_in_sence,kp2,matches[:15],None) cv.imshow("-match",result) cv.waitKey(0) cv.destroyAllWindows()
SIFT算法啟示
多尺度金字塔,特征金字塔技術(shù),遷移不變性與旋轉(zhuǎn)不變性特征,這兩點(diǎn)現(xiàn)在卷積神經(jīng)網(wǎng)絡(luò)及其變種的網(wǎng)絡(luò)中也是很常見的特征工程技術(shù)。
審核編輯:劉清
-
OpenCV
+關(guān)注
關(guān)注
29文章
624瀏覽量
41214 -
LBP
+關(guān)注
關(guān)注
0文章
14瀏覽量
8939 -
SIFT算法
+關(guān)注
關(guān)注
0文章
8瀏覽量
7401
原文標(biāo)題:OpenCV4中 SIFT特征算法詳解與使用
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論