0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV4中SIFT算法概述

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 作者:gloomyfish ? 2022-11-23 09:48 ? 次閱讀

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)建高斯多尺度金字塔

常見的高斯圖像金字塔是每層只有一張圖像,大致如下:

7707d8c8-6a72-11ed-8abf-dac502259ad0.jpg

上述的是通過圖像金字塔實(shí)現(xiàn)了多分辨率,如果我們在每一層高斯金字塔圖像生成的時(shí)候,給予不同的sigma值,這樣不同的sigam就會產(chǎn)生不同模糊版本的圖像,在同一層中就是實(shí)現(xiàn)不同尺度的模糊圖像,再結(jié)合高斯金字塔,生成多個(gè)層多個(gè)尺度的金字塔,就是實(shí)現(xiàn)了圖像的多尺度金字塔。同一張圖像不同尺度高斯模糊如下:

7727b68e-6a72-11ed-8abf-dac502259ad0.jpg

為了在每層圖像中檢測 S 個(gè)尺度的極值點(diǎn),DoG 金字塔每層需 S+2 張圖像,因?yàn)槊拷M的第一張和最后一張圖像上不能檢測極值,DoG 金字塔由高斯金字塔相鄰兩張相減得到,則高斯金字塔每層最少需 S+3 張圖像,實(shí)際計(jì)算時(shí) S 通常在2到5之間。SIFT算法中生成高斯金字塔的規(guī)則如下(尺度空間不變性):

774c854a-6a72-11ed-8abf-dac502259ad0.jpg

關(guān)鍵點(diǎn)精準(zhǔn)定位與過濾

對得到的每層DOG圖像,計(jì)算窗口3x3x3范圍除去中心點(diǎn)之外的26點(diǎn)與中心點(diǎn)比較大小,尋找最大值或者最小值(極值點(diǎn)),如下圖:

777c1ff8-6a72-11ed-8abf-dac502259ad0.jpg

即周圍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),如下圖所示:

77a44ca8-6a72-11ed-8abf-dac502259ad0.jpg

從上圖我們也可以看出,在連續(xù)空間的極值點(diǎn)必然是導(dǎo)數(shù)過零點(diǎn),

77d73e6a-6a72-11ed-8abf-dac502259ad0.jpg

對于|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)定性與抗干擾能力。圖示如下:

77f94564-6a72-11ed-8abf-dac502259ad0.jpg

描述子生成

選擇關(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)的唯一描述

782be938-6a72-11ed-8abf-dac502259ad0.jpg

根據(jù)排序以后生成描述子的規(guī)則不同,又可以分為

原圖正常順序描述子

水平反射順序描述子

垂直反射順序描述子

如下圖所示:

784e5626-6a72-11ed-8abf-dac502259ad0.jpg

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ù)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    624

    瀏覽量

    41214
  • LBP
    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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    圖像識別SIFT算法與SURF算法的區(qū)別

    SIFT特征是基于物體上的一些局部外觀的興趣點(diǎn)而與影像的大小和旋轉(zhuǎn)無關(guān)。對于光線、噪聲、微視角改變的容忍度也相當(dāng)高。SURF也是一種類似于SIFT的興趣點(diǎn)檢測及描述子算法。其通過Hessian矩陣的行列式來確定興趣點(diǎn)位置,再根據(jù)
    的頭像 發(fā)表于 12-15 07:56 ?3.1w次閱讀
    圖像識別<b class='flag-5'>中</b><b class='flag-5'>SIFT</b><b class='flag-5'>算法</b>與SURF<b class='flag-5'>算法</b>的區(qū)別

    OpenCV4.8 CUDA編程代碼教程

    OpenCV4支持通過GPU實(shí)現(xiàn)CUDA加速執(zhí)行,實(shí)現(xiàn)對OpenCV圖像處理程序的加速運(yùn)行,當(dāng)前支持加速的模塊包括如下。
    的頭像 發(fā)表于 12-05 09:56 ?954次閱讀
    <b class='flag-5'>OpenCV</b>4.8 CUDA編程代碼教程

    CMake在Linux 6.1.1-1.0.0搜索包opencv損壞了嗎?

    imx-image-multimedia 的 SDK,我收到以下錯(cuò)誤: sysroots/armv8a-poky-linux/usr/lib/cmake/opencv4/OpenCVModules.cmake
    發(fā)表于 05-09 11:32

    基于SIFT的三視圖像特征匹配算法

    提出一種基于SIFT的三視圖像特征匹配算法。采用SIFT算法對三視圖像進(jìn)行特征匹配,引入計(jì)算機(jī)視覺的三線性關(guān)系和基于三焦張量的像素轉(zhuǎn)移誤差
    發(fā)表于 04-18 09:49 ?24次下載

    基于對比度閾值的改進(jìn)SIFT算法

    為了提高基于SIFT(Scale Invariant Feature Transform)圖像匹配算法對于圖像對比度變化的魯棒性和算法效率,提出了一種具有可變系數(shù)的自適應(yīng)對比度閾值SIFT
    發(fā)表于 10-26 15:11 ?0次下載

    基于改進(jìn)SIFT的圖像拼接算法

    針對目前基于SIFT的圖像拼接算法復(fù)雜度較高和特征點(diǎn)匹配不準(zhǔn)等問題,提出了一種基于改進(jìn)SIFT的圖像拼接算法。算法利用改進(jìn)的
    發(fā)表于 02-21 16:04 ?0次下載
    基于改進(jìn)<b class='flag-5'>SIFT</b>的圖像拼接<b class='flag-5'>算法</b>

    基于LDA的SIFT算法在圖像配準(zhǔn)的應(yīng)用

    針對SIFT算法復(fù)雜程度高,實(shí)時(shí)性差,在維數(shù)較高的圖像配準(zhǔn)并不實(shí)用的問題,提出了一種基于線性鑒別分析(LDA)的SIFT算法
    發(fā)表于 07-24 16:30 ?22次下載

    一種優(yōu)化的SIFT配準(zhǔn)算法

    針對SIFT算法在生成特征向量和進(jìn)行特征匹配過程存在的計(jì)算量較大、容易產(chǎn)生誤匹配等不足,提出一種優(yōu)化的SIFT配準(zhǔn)算法。優(yōu)化
    發(fā)表于 12-05 13:46 ?0次下載
    一種優(yōu)化的<b class='flag-5'>SIFT</b>配準(zhǔn)<b class='flag-5'>算法</b>

    sift算法matlab代碼詳解

    尺度不變特征轉(zhuǎn)換(Scale-invariant feature transform或SIFT)是一種電腦視覺的算法用來偵測與描述影像的局部性特征,它在空間尺度尋找極值點(diǎn),并提取出
    發(fā)表于 02-26 10:37 ?8676次閱讀
    <b class='flag-5'>sift</b><b class='flag-5'>算法</b>matlab代碼詳解

    sift算法原理詳解及應(yīng)用

    Sift算法是David Lowe于1999年提出的局部特征描述子,并于2004年進(jìn)行了更深入的發(fā)展和完善。Sift特征匹配算法可以處理兩幅圖像之間發(fā)生平移、旋轉(zhuǎn)、仿射變換情況下的匹配
    發(fā)表于 02-26 11:06 ?6.9w次閱讀

    基于GPU 的SIFT實(shí)時(shí)優(yōu)化算法綜述

    Optimized SIFT( Cosift)。該算法首先利用CUDA流并發(fā)構(gòu)建SIFT尺度空間,在此過程充分利用了CUDA存儲器模型
    發(fā)表于 05-13 11:31 ?11次下載

    基于改進(jìn)SIFT和RANSAC圖像拼接算法研究_馬強(qiáng)

    基于改進(jìn)SIFT和RANSAC圖像拼接算法研究_馬強(qiáng)(怎樣測監(jiān)控電源電流)-基于改進(jìn)SIFT和RANSAC圖像拼接算法研究_馬強(qiáng)這是一份非常不錯(cuò)的資料,歡迎下載,希望對您有幫助!
    發(fā)表于 07-26 12:53 ?12次下載
    基于改進(jìn)<b class='flag-5'>SIFT</b>和RANSAC圖像拼接<b class='flag-5'>算法</b>研究_馬強(qiáng)

    基于opencv4和Yolo-Fastest,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)

    效果視頻 基于opencv4和yolo,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)
    發(fā)表于 11-23 17:36 ?16次下載
    基于<b class='flag-5'>opencv4</b>和Yolo-Fastest,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)

    如何在Raspberry Pi 3上安裝OpenCV4

    今天我們將學(xué)習(xí)如何在 Raspberry Pi 3 上安裝 OpenCV4 庫,以便我們可以將其用于計(jì)算機(jī)視覺應(yīng)用程序。這將允許 OpenCV 在像 Pi 這樣的便攜式設(shè)備上運(yùn)行,從而打開許多可能性的大門。所以讓我們開始吧
    的頭像 發(fā)表于 09-08 16:09 ?1564次閱讀
    如何在Raspberry Pi 3上安裝<b class='flag-5'>OpenCV4</b>庫

    學(xué)習(xí)OpenCV4的系統(tǒng)化路線圖

    OpenCV4發(fā)布測試版本開始,作者就一直關(guān)注!根據(jù)自己近十年圖像處理OpenCV開發(fā)相關(guān)工作經(jīng)驗(yàn),花了七個(gè)月的時(shí)間,針對OpenCV4、精心選擇OpenCV中常用模塊與知識點(diǎn),構(gòu)建
    的頭像 發(fā)表于 07-05 11:30 ?586次閱讀
    學(xué)習(xí)<b class='flag-5'>OpenCV4</b>的系統(tǒng)化路線圖