激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python opencv之SIFT算法示例

python opencv之SIFT算法示例

2021-01-17 00:37@fei Python

這篇文章主要介紹了python opencv之SIFT算法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

目標:

學習sift算法的概念
學習在圖像中查找sift關鍵的和描述符

原理:

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

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

python opencv之SIFT算法示例

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

sift特性:

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

sift特點:

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

sift算法步驟:

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

尺度空間極值檢測:

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

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

python opencv之SIFT算法示例

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

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

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

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

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

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

構建尺度空間的目的是為了檢測出在不同的尺度下都存在的特征點,如此可以獲得縮放不變性

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

如果求取特征點,可以使用一個叫做拉普拉斯算子進行運算

但是,由于拉普拉斯算子的效率太低,再sift算法當中使用差分來代替。

高斯金字塔:

在建立尺度空間后,需要找到關鍵點,此時需要實現(xiàn)高斯金字塔的構造來實現(xiàn)關鍵點的求取。在高斯金字塔當中,“塔”的每一層都是圖像,“塔”的高度就是上面提到的尺度σ。“塔”的每一層對應一個σ值,同時將高斯金字塔中的圖像分成組,每組當中圖像的尺寸相同,但是尺度σ不同。具體尺度之間的計算關系,先忽略,如下圖所示:

python opencv之SIFT算法示例

高斯差分金字塔dog:

每一組相鄰當中相鄰兩層的圖像做差,得到的圖像再“疊”成一個金字塔就是高斯差分金字塔dog。

dog局部特征點檢測:

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

計算一個某一個點是否是局部最大值,在離散的三維空間當中,以該點為中心,檢測它周圍的點。類似魔方的中心位置一樣,如下圖中的“叉”就是待計算是否是局部極值點。

python opencv之SIFT算法示例

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

關鍵點定位:

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

主要是去掉dog局部曲率非常不對稱的像素。

因為低對比度的特征點和邊界點對光照和噪聲變化非常敏感,所以要去掉。利用閾值的方法來限制,在opencv中為contrastthreshold。

去除低對比度的特征點:

使用泰勒公式對dog函數(shù)空間進行擬合,去掉小于修正閾值的關鍵點。

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

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

關鍵點設定方向參數(shù):

每個關鍵點設置方向以后可以獲得旋轉不變性。

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

python opencv之SIFT算法示例

關鍵點描述符:

經過上面的步驟計算,每個關鍵點有三個信息,位置、尺度、方向。所以具備平移、縮放、和旋轉不變性。

接下來對每個關鍵點用一組向量將這個關鍵點描述出來,使其不隨著光照、視角等等影響而改變。該描述符不但涉及關鍵點,而且還涉及到關鍵點周圍的像素,使其有更強的不變特性。

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

python opencv之SIFT算法示例

關鍵點匹配:

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

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

比較之后,需要在進行消除錯配點才算完成。

opencv 中的 sift:

關于opencv版本與sift算法不能調用的問題:

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

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

網上有一大堆教程關于如何在opencv當中如何添加opencv-contrib的教程,使用cmake,使用vs,啥的非常麻煩。

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

結果,還真找到了 哈哈。

這下方便了,只要在你的控制臺當中輸入
pip install opencv-contrib-python即可

如果pip安裝不上去

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

網站在此!!!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)#找到關鍵點
 
img=cv2.drawkeypoints(gray,kp,img)#繪制關鍵點
 
cv2.imshow('sp',img)
cv2.waitkey(0)

返回的關鍵點是一個帶有很多不用屬性的特殊結構體,屬性當中有坐標,方向、角度等等。

計算關鍵點描述符:

使用sift.compute()函數(shù)來進行計算關鍵點描述符

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

如果未找到關鍵點,可使用函數(shù)sift.detectandcompute()直接找到關鍵點并計算。

在第二個函數(shù)中,kp為關鍵點列表,des為numpy的數(shù)組,為關鍵點數(shù)目×128

?
1
2
3
sift = cv2.xfeatures2d.sift_create()
 
kp, des = sift.detectandcompute(gray,none)

結果如圖

python opencv之SIFT算法示例

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/tengfei461807914/article/details/78175095

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 在线小视频国产 | 国产91av视频 | 看a级毛片| 69性欧美高清影院 | 欧美日本不卡 | 女人叉开腿让男人桶 | 一级免费| 亚洲视屏在线观看 | 欧美另类视频在线 | 美女一级视频 | 末成年女av片一区二区 | 12av毛片 | 久国久产久精永久网页 | 久久久久亚洲a | 亚洲影视在线观看 | 黄色网址免费在线 | 黄色免费高清网站 | 狠狠干伊人网 | 黄色特级毛片 | 一级黄色在线免费观看 | 成人福利视频导航 | 亚洲二区免费 | 欧美成人精品欧美一级乱黄 | 逼特逼视频在线观看 | 天天碰天天操 | 黄色免费在线视频网站 | 草莓福利视频在线观看 | 狠狠干91 | 国产一级淫片在线观看 | 99爱福利视频在线观看 | 欧美黄色试片 | 人人做人人看 | 日本一区二区精品 | 国产精品成人久久久久a级 欧美特黄一级高清免费的香蕉 | 看毛片的网址 | 国产九色视频在线观看 | 欧美69free性videos | 久久国产中文 | 最新中文字幕在线视频 | 国产精品久久久久影院老司 | 免费一级在线视频 |