衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenCV4中SIFT算法概述

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

SIFT概述

SIFT特征是非常穩定的圖像特征,在圖像搜索、特征匹配、圖像分類檢測等方面應用十分廣泛,但是它的缺點也是非常明顯,就是計算量比較大,很難實時,所以對一些實時要求比較高的常見SIFT算法還是無法適用。

如今SIFT算法在深度學習特征提取與分類檢測網絡大行其道的背景下,已經越來越有雞肋的感覺,但是它本身的算法知識還是很值得我們學習,對我們也有很多有益的啟示,本質上SIFT算法是很多常見算法的組合與巧妙銜接,這個思路對我們自己處理問題可以帶來很多有益的幫助。

特別是SIFT特征涉及到尺度空間不變性與旋轉不變性特征,是我們傳統圖像特征工程的兩大利器,可以擴展與應用到很多圖像特征提取的算法當中,比如SURF、HOG、HAAR、LBP等。

夸張一點的說SIFT算法涵蓋了圖像特征提取必備的精髓思想,從特征點的檢測到描述子生成,完成了對圖像的準確描述,早期的ImageNet比賽中,很多圖像分類算法都是以SIFT與HOG特征為基礎,所有SIFT算法還是值得認真詳細解讀一番的。SIFT特征提取歸納起來SIFT特征提取主要有如下幾步:

構建高斯多尺度金字塔

關鍵點精準定位與過濾

關鍵點方向指派

描述子生成

構建高斯多尺度金字塔

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

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

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

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

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

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

關鍵點精準定位與過濾

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

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

即周圍26個點(青色)要小于或者大于中心像素點,這樣就得到初步的極值點候選,然后進行亞像素級別的精準定位。

原因在于圖像得到像素坐標是離散的,尺度空間也是離散的間隔,每個極值點P(x, y, s)三維空間中不一定是真正的連續空間的極值點,以二維的曲線為例,得到藍色是離散空間極值點,實際極值點是紅色點,如下圖所示:

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

從上圖我們也可以看出,在連續空間的極值點必然是導數過零點,

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

對于|D(extremal)| < 0.03可以作為低對比度點或者弱邊緣舍棄。

關鍵點方向指派

前面我們已經詳細解釋了SIFT特征點是如何提取的,有了特征點之后,我們對特征點周圍的像素塊計算角度方向直方圖,在計算直方圖之前首先需要對圖像進行梯度計算,這里可以使用SOBEL算子,然后根據dx與dy計算梯度和與角度,這里使用的高斯權重,所以在梯度之前,首先需要對ROI區域進行高斯模糊,然后再計算角度(x軸,Bins)-梯度(Y軸)直方圖,直方圖的最高峰(max peak)對應的角度就是關鍵點的角度方向,對于大于max peak*85%的bin也作為方向指派給關鍵點,這樣同一個關鍵點因為有多個方向在描述子生成的時候就會生成多個描述子,從而增加了特征的穩定性與抗干擾能力。圖示如下:

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

描述子生成

選擇關鍵點小區域,根據窗口大小不同可以分為4x4大小不同的Cell,每個Cell生成一個角度方向直方圖(8個BIN),對它們進行排序以后(旋轉不變性描述子),生成128個向量特征數據,作為該關鍵點的唯一描述

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

根據排序以后生成描述子的規則不同,又可以分為

原圖正常順序描述子

水平反射順序描述子

垂直反射順序描述子

如下圖所示:

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

OpenCV中調用

OpenCV已經實現了SIFT算法,但是在OpenCV3.0之后因為專利授權問題,該算法在擴展模塊xfeature2d中,需要自己編譯才可以使用。

但是在OpenCV4.4之后因為專利過期,SIFT算法又回到了正式發布安裝包中,無需編譯源碼,即可使用!首先需要創建一個SIFT檢測器對象,通過調用

通過detect方法提取對象關鍵點

用drawKeypoints繪制關鍵點

通過compute提取描述子,

通過暴力匹配根據描述子匹配

代碼演示如下

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)

#創建SIFT特征檢測器
sift=cv.xfeatures2d.SIFT_create()

#特征點提取與描述子生成
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算法啟示

多尺度金字塔,特征金字塔技術,遷移不變性與旋轉不變性特征,這兩點現在卷積神經網絡及其變種的網絡中也是很常見的特征工程技術。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41556
  • LBP
    LBP
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8967
  • SIFT算法
    +關注

    關注

    0

    文章

    8

    瀏覽量

    7460

原文標題:OpenCV4中 SIFT特征算法詳解與使用

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    圖像識別SIFT算法與SURF算法的區別

    SIFT特征是基于物體上的一些局部外觀的興趣點而與影像的大小和旋轉無關。對于光線、噪聲、微視角改變的容忍度也相當高。SURF也是一種類似于SIFT的興趣點檢測及描述子算法。其通過Hessian矩陣的行列式來確定興趣點位置,再根據
    的頭像 發表于 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>的區別

    OpenCV4.8 CUDA編程代碼教程

    OpenCV4支持通過GPU實現CUDA加速執行,實現對OpenCV圖像處理程序的加速運行,當前支持加速的模塊包括如下。
    的頭像 發表于 12-05 09:56 ?1106次閱讀
    <b class='flag-5'>OpenCV</b>4.8 CUDA編程代碼教程

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

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

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

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

    基于對比度閾值的改進SIFT算法

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

    基于改進SIFT的圖像拼接算法

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

    基于LDA的SIFT算法在圖像配準的應用

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

    一種優化的SIFT配準算法

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

    sift算法matlab代碼詳解

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

    sift算法原理詳解及應用

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

    基于GPU 的SIFT實時優化算法綜述

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

    基于改進SIFT和RANSAC圖像拼接算法研究_馬強

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

    基于opencv4和Yolo-Fastest,實現PC和單片機通信,控制步進電機捕獲目標

    效果視頻 基于opencv4和yolo,實現PC和單片機通信,控制步進電機捕獲目標
    發表于 11-23 17:36 ?16次下載
    基于<b class='flag-5'>opencv4</b>和Yolo-Fastest,實現PC和單片機通信,控制步進電機捕獲目標

    如何在Raspberry Pi 3上安裝OpenCV4

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

    學習OpenCV4的系統化路線圖

    OpenCV4發布測試版本開始,作者就一直關注!根據自己近十年圖像處理OpenCV開發相關工作經驗,花了七個月的時間,針對OpenCV4、精心選擇OpenCV中常用模塊與知識點,構建
    的頭像 發表于 07-05 11:30 ?674次閱讀
    學習<b class='flag-5'>OpenCV4</b>的系統化路線圖
    广州百家乐赌博机| 洞头县| 百家乐官网平玩法几副牌| 新利棋牌游戏| 24山入宅择日| 松滋市| 正品百家乐的玩法技巧和规则| 百家乐官网网上漏洞| 机率游戏| 百家乐跟路技巧| 百家乐官网技巧-澳门百家乐官网官方网址 | 百家乐官网真人游戏赌场娱乐网规则| e世博资讯网| 澳门百家乐博客| 七胜百家乐官网娱乐城总统网上娱乐城大都会娱乐城赌场 | 大发888娱乐场注册| 百家乐蓝盾假网| 网上百家乐官网投注法| 百家乐玩法官网| 缅甸百家乐网站| 澳门百家乐官网单注下限| 永利高平台| 星河百家乐现金网| 在线百家乐官网技巧| 皇冠现金网哪个最好| 什么百家乐平注法| 连环百家乐官网怎么玩| 博彩乐透乐| 百家乐全部规则| 属虎和属龙合伙做生意| 百家乐官网赌具哪里最好| 通化大嘴棋牌游戏| 百家乐是怎样算牌| 百家乐官网大路图| 光泽县| 大发888娱乐场 东南网| 百家乐凯时娱乐网| 百家乐官网追号| 豪华百家乐官网桌子厂家 | 赌博运气| 大发888 894|