欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python opencv之SIFT算法示例

 更新時(shí)間:2018年02月24日 09:17:57   作者:@fei  
這篇文章主要介紹了python opencv之SIFT算法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

本文介紹了python opencv之SIFT算法示例,分享給大家,具體如下:

目標(biāo):

學(xué)習(xí)SIFT算法的概念
學(xué)習(xí)在圖像中查找SIFT關(guān)鍵的和描述符

原理:

(原理部分自己找了不少文章,內(nèi)容中有不少自己理解和整理的東西,為了方便快速理解內(nèi)容和能夠快速理解原理,本文盡量不使用數(shù)學(xué)公式,僅僅使用文字來描述。本文中有很多引用別人文章的內(nèi)容,僅供個(gè)人記錄使用,若有錯(cuò)誤,請(qǐng)指正出來,萬分感謝)

之前的harris算法和Shi-Tomasi 算法,由于算法原理所致,具有旋轉(zhuǎn)不變性,在目標(biāo)圖片發(fā)生旋轉(zhuǎn)時(shí)依然能夠獲得相同的角點(diǎn)。但是如果對(duì)圖像進(jìn)行縮放以后,再使用之前的算法就會(huì)檢測(cè)不出來,原理用一張圖表示(圖1):

這里寫圖片描述

(harris算法和shi-tomasi算法都是基于窗口中像素分布和變化的原理,在圖像放大且窗口大小不發(fā)生變化的時(shí),窗口中的像素信息則會(huì)有很大的不同,造成無法檢測(cè)的結(jié)果)

SIFT特性:

  1. 獨(dú)特性,也就是特征點(diǎn)可分辨性高,類似指紋,適合在海量數(shù)據(jù)中匹配。
  2. 多量性,提供的特征多。
  3. 高速性,就是速度快。
  4. 可擴(kuò)展,能與其他特征向量聯(lián)合使用。

SIFT特點(diǎn):

  1. 旋轉(zhuǎn)、縮放、平移不變性
  2. 解決圖像仿射變換,投影變換的關(guān)鍵的匹配
  3. 光照影響小
  4. 目標(biāo)遮擋影響小
  5. 噪聲景物影響小

SIFT算法步驟:

  1. 尺度空間極值檢測(cè)
  2. 關(guān)鍵點(diǎn)定位
  3. 關(guān)鍵點(diǎn)方向參數(shù)
  4. 關(guān)鍵點(diǎn)描述符
  5. 關(guān)鍵點(diǎn)匹配

尺度空間極值檢測(cè):

尺度空間的個(gè)人理解:
你找一張分辨率1024×1024圖片,在電腦上觀看,十分清晰,但是圖片太大?,F(xiàn)在把這圖片反正photoshop上,將分辨率改成512×512,圖片看著依然很清晰,但是不可能像1024×1024的畫面那么精細(xì),只不過是因?yàn)槿搜蹣?gòu)造的原因,512×512圖片依然能讓你分辨出這是個(gè)什么東西。

粗俗點(diǎn)說,尺度空間,就相當(dāng)于一個(gè)圖片需要獲得多少分辨率的量級(jí)。如果把一個(gè)圖片從原始分辨率到,不停的對(duì)其分辨率進(jìn)行減少,然后將這些圖片摞在一起,可以看成一個(gè)四棱錐的樣式,這個(gè)東西就叫做圖像金字塔(如下圖,圖2)。

這里寫圖片描述

再回到尺度空間,在攝像頭中,計(jì)算機(jī)無法分辨一個(gè)景物的尺度信息。而人眼不同,除了人大腦里已經(jīng)對(duì)物體有了基本的概念(例如正常人在十幾米外看到蘋果,和在近距離看到蘋果,都能認(rèn)出是蘋果)以外,人眼在距離物體近時(shí),能夠獲得物體足夠多的特性,在距離物體遠(yuǎn)時(shí),能夠或略細(xì)節(jié),例如,近距離看一個(gè)人臉能看到毛孔,距離遠(yuǎn)了看不到毛孔等等。

在圖片信息當(dāng)中,分辨率都是固定的,要想得到類似人眼的效果,就要把圖片弄成不同的分辨率,制作成圖像金字塔來模擬人眼的功能,從而在其他圖片中進(jìn)行特征識(shí)別時(shí),能夠像人眼睛一樣,即使要識(shí)別的物體尺寸變大或者變小,也能夠識(shí)別出來!

從圖1可以看出,如果如果圖像變大,窗口大小還是以前的大小,則無法正確檢測(cè)出角點(diǎn)。那么很自然的就能想到,如果圖片變大,咱們把窗口也放大不就行了? 這就需要上面提到的尺度空間發(fā)揮作用。

在SIFT當(dāng)中,利用了一個(gè)叫做高斯核的方程來構(gòu)建尺度空間,原因是高斯核函數(shù)是唯一多尺度空間的核。聽起來比較晦澀,個(gè)人理解為:

高斯核函數(shù)在之前的高斯濾波當(dāng)中使用過,其原理就是利用高斯分布的特性,在以某一個(gè)點(diǎn)為中心要進(jìn)行以某一個(gè)窗口大小進(jìn)行模糊的操作。那么,根據(jù)濾波的原理,距離中心像素點(diǎn)位置的距離越遠(yuǎn)的像素點(diǎn),需要“模糊化效果”的值就應(yīng)該越少。那么這個(gè)距離值的分配方法,就是利用滿足高斯核函數(shù)的分配方法,由中心,到四周,符合高斯核函數(shù)的“鐘型”曲線(從二維上看)。

那么尺度空間中的高斯核也可以這么理解,高斯核函數(shù)的參數(shù)有三個(gè)G(x,y,σ) ,在濾波當(dāng)中,第三個(gè)參數(shù)σ在運(yùn)算中是固定的一個(gè)值。而在尺度空間的構(gòu)造當(dāng)中,所謂的“尺度”,就是這個(gè)σ值變化,而x和y表示像素坐標(biāo)。σ的值越小,圖像被平滑(被模糊)的越少,尺度也越小。所以,大尺度圖片可以對(duì)應(yīng)成一個(gè)圖像離遠(yuǎn)處觀看,是個(gè)大致輪廓,小尺度圖片可以對(duì)應(yīng)成離近處觀看,有更多細(xì)節(jié)。

構(gòu)建尺度空間的目的是為了檢測(cè)出在不同的尺度下都存在的特征點(diǎn),如此可以獲得縮放不變性

其中利用圖像I(x,y)G(x,y,σ) 進(jìn)行卷積運(yùn)算,得到尺度空間L(x,y,σ),可以理解,所謂的“尺度空間”在這里就是這個(gè)函數(shù)L(x,y,σ)

如果求取特征點(diǎn),可以使用一個(gè)叫做拉普拉斯算子進(jìn)行運(yùn)算

但是,由于拉普拉斯算子的效率太低,再SIFT算法當(dāng)中使用差分來代替。

高斯金字塔:

在建立尺度空間后,需要找到關(guān)鍵點(diǎn),此時(shí)需要實(shí)現(xiàn)高斯金字塔的構(gòu)造來實(shí)現(xiàn)關(guān)鍵點(diǎn)的求取。在高斯金字塔當(dāng)中,“塔”的每一層都是圖像,“塔”的高度就是上面提到的尺度σ?!八钡拿恳粚訉?duì)應(yīng)一個(gè)σ值,同時(shí)將高斯金字塔中的圖像分成組,每組當(dāng)中圖像的尺寸相同,但是尺度σ不同。具體尺度之間的計(jì)算關(guān)系,先忽略,如下圖所示:

這里寫圖片描述

高斯差分金字塔DOG:

每一組相鄰當(dāng)中相鄰兩層的圖像做差,得到的圖像再“疊”成一個(gè)金字塔就是高斯差分金字塔DOG。

DOG局部特征點(diǎn)檢測(cè):

有了差分金字塔,現(xiàn)在便可以計(jì)算關(guān)鍵點(diǎn)(特征點(diǎn))。由于金字塔的模型不是二維模型,而是一個(gè)三維模型,這里計(jì)算極值的方法也不再是二維求取極值的方法。

計(jì)算一個(gè)某一個(gè)點(diǎn)是否是局部最大值,在離散的三維空間當(dāng)中,以該點(diǎn)為中心,檢測(cè)它周圍的點(diǎn)。類似魔方的中心位置一樣,如下圖中的“叉”就是待計(jì)算是否是局部極值點(diǎn)。

這里寫圖片描述

這里說明,局部極值點(diǎn)都是在同一個(gè)組當(dāng)中進(jìn)行的,所以肯定有這樣的問題,某一組當(dāng)中的第一個(gè)圖和最后一個(gè)圖層沒有前一張圖和下一張圖,那該怎么計(jì)算? 解決辦法是,在用高斯模糊,在高斯金字塔多“模糊”出三張來湊數(shù),所以在DOG中多出兩張。

關(guān)鍵點(diǎn)定位:

上面找到的關(guān)鍵點(diǎn)要進(jìn)行處理,去除一些不好的特征點(diǎn),保存下來的特征點(diǎn)能夠滿足穩(wěn)定性等條件。

主要是去掉DOG局部曲率非常不對(duì)稱的像素。

因?yàn)榈蛯?duì)比度的特征點(diǎn)和邊界點(diǎn)對(duì)光照和噪聲變化非常敏感,所以要去掉。利用閾值的方法來限制,在opencv中為contrastThreshold。

去除低對(duì)比度的特征點(diǎn):

使用泰勒公式對(duì)DOG函數(shù)空間進(jìn)行擬合,去掉小于修正閾值的關(guān)鍵點(diǎn)。

去除不穩(wěn)定的邊界點(diǎn):

利用Hessian矩陣(就是求導(dǎo)數(shù)的矩陣),利用邊緣梯度的方向上主曲率值比較大,而沿著邊緣方向則主曲率值較小的原理,將主曲率限制為某個(gè)值。滿足該值條件的點(diǎn)留下,反之去除。

關(guān)鍵點(diǎn)設(shè)定方向參數(shù):

每個(gè)關(guān)鍵點(diǎn)設(shè)置方向以后可以獲得旋轉(zhuǎn)不變性。

獲取關(guān)鍵點(diǎn)所在尺度空間的鄰域,然后計(jì)算該區(qū)域的梯度和方向,根據(jù)計(jì)算得到的結(jié)果創(chuàng)建方向直方圖,直方圖的峰值為主方向的參數(shù),其他高于主方向百分之80的方向被判定為輔助方向,這樣設(shè)定對(duì)穩(wěn)定性有很大幫助。如圖

這里寫圖片描述

關(guān)鍵點(diǎn)描述符:

經(jīng)過上面的步驟計(jì)算,每個(gè)關(guān)鍵點(diǎn)有三個(gè)信息,位置、尺度、方向。所以具備平移、縮放、和旋轉(zhuǎn)不變性。

接下來對(duì)每個(gè)關(guān)鍵點(diǎn)用一組向量將這個(gè)關(guān)鍵點(diǎn)描述出來,使其不隨著光照、視角等等影響而改變。該描述符不但涉及關(guān)鍵點(diǎn),而且還涉及到關(guān)鍵點(diǎn)周圍的像素,使其有更強(qiáng)的不變特性。

基本原理是選取關(guān)鍵點(diǎn)周圍16×16的像素區(qū)域,分成4個(gè)小塊,每個(gè)小塊創(chuàng)建8個(gè)bin的直方圖,這總共的128個(gè)信息的向量就是關(guān)鍵點(diǎn)描述符的主要內(nèi)容。此外還要測(cè)量,以達(dá)到光照、旋轉(zhuǎn)的穩(wěn)定性。如圖

這里寫圖片描述

關(guān)鍵點(diǎn)匹配:

分別對(duì)模板圖和實(shí)時(shí)圖建立關(guān)鍵點(diǎn)描述符集合,通過對(duì)比關(guān)鍵點(diǎn)描述符來判斷兩個(gè)關(guān)鍵點(diǎn)是否相同。128個(gè)信息的向量使用歐氏距離來實(shí)現(xiàn)。

在關(guān)鍵點(diǎn)的匹配當(dāng)中,使用的搜索算法為區(qū)域搜索算法當(dāng)中最常用的k-d樹實(shí)現(xiàn)。

比較之后,需要在進(jìn)行消除錯(cuò)配點(diǎn)才算完成。

OpenCV 中的 SIFT:

關(guān)于opencv版本與SIFT算法不能調(diào)用的問題:

SIFT算法是一個(gè)有專利的算法,在商業(yè)用途上是收費(fèi)的。對(duì)于窮B學(xué)生,算法的發(fā)明者還比較仁慈,可以使用。
不過,在python當(dāng)中使用SIFT算法和版本之間有不少關(guān)系,源文檔當(dāng)中使用opencv版本是2.4.9版本,此版本可以隨意使用SIFT算法。

但是,在opencv3當(dāng)中就沒那么幸運(yùn)了,opencv中的很多特征點(diǎn)提取算法都和cv2中的庫分離開,必須要添加opencv-contrib才可以使用,本人使用的opencv版本是3.3.0,幾乎是最新的版本。

網(wǎng)上有一大堆教程關(guān)于如何在opencv當(dāng)中如何添加opencv-contrib的教程,使用cmake,使用vs,啥的非常麻煩。

本人狗急跳墻,尋思在pip上面有沒有啥第三方的庫可以直接就將opencv-contrib這個(gè)庫。

結(jié)果,還真找到了 哈哈。

這下方便了,只要在你的控制臺(tái)當(dāng)中輸入
pip install opencv-contrib-python即可

如果pip安裝不上去

直接上官方上面下個(gè)輪子,然后pip安裝就能用了

網(wǎng)站在此!??!

import cv2
import numpy as np


img = cv2.imread('1.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()


kp = sift.detect(gray,None)#找到關(guān)鍵點(diǎn)

img=cv2.drawKeypoints(gray,kp,img)#繪制關(guān)鍵點(diǎn)

cv2.imshow('sp',img)
cv2.waitKey(0)

返回的關(guān)鍵點(diǎn)是一個(gè)帶有很多不用屬性的特殊結(jié)構(gòu)體,屬性當(dāng)中有坐標(biāo),方向、角度等等。

計(jì)算關(guān)鍵點(diǎn)描述符:

使用sift.compute()函數(shù)來進(jìn)行計(jì)算關(guān)鍵點(diǎn)描述符

kp,des = sift.compute(gray,kp)

如果未找到關(guān)鍵點(diǎn),可使用函數(shù)sift.detectAndCompute()直接找到關(guān)鍵點(diǎn)并計(jì)算。

在第二個(gè)函數(shù)中,kp為關(guān)鍵點(diǎn)列表,des為numpy的數(shù)組,為關(guān)鍵點(diǎn)數(shù)目×128

sift = cv2.xfeatures2d.SIFT_create()

kp, des = sift.detectAndCompute(gray,None)

結(jié)果如圖

這里寫圖片描述

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用smtplib和email封裝python發(fā)送郵件模塊類分享

    用smtplib和email封裝python發(fā)送郵件模塊類分享

    本文針對(duì)發(fā)郵件相關(guān)的操作進(jìn)行了封裝,包括發(fā)送文本、HTML、帶附件的郵件,使用Python發(fā)郵件,主要用到smtplib和email兩個(gè)模塊,需要的朋友可以參考下
    2014-02-02
  • 實(shí)例詳解Python模塊decimal

    實(shí)例詳解Python模塊decimal

    這篇文章主要介紹了Python模塊decimal ,Python提供了decimal模塊用于十進(jìn)制數(shù)學(xué)計(jì)算,它具有以下特點(diǎn)在文中給大家詳細(xì)介紹,需要的朋友可以參考下
    2019-06-06
  • Python最火、R極具潛力 2017機(jī)器學(xué)習(xí)調(diào)查報(bào)告

    Python最火、R極具潛力 2017機(jī)器學(xué)習(xí)調(diào)查報(bào)告

    Python最火,R極具潛力,分享2017機(jī)器學(xué)習(xí)調(diào)查報(bào)告,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Python3.5 Pandas模塊之DataFrame用法實(shí)例分析

    Python3.5 Pandas模塊之DataFrame用法實(shí)例分析

    這篇文章主要介紹了Python3.5 Pandas模塊之DataFrame用法,結(jié)合實(shí)例形式詳細(xì)分析了Python3.5中Pandas模塊的DataFrame結(jié)構(gòu)創(chuàng)建、讀取、過濾、獲取等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • Python變量類型知識(shí)點(diǎn)總結(jié)

    Python變量類型知識(shí)點(diǎn)總結(jié)

    在本文里我們給大家分析一篇關(guān)于Python變量類型的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們跟著學(xué)習(xí)下。
    2019-02-02
  • 最新評(píng)論