亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python opencv之SURF算法示例

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

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

目標(biāo):

  1. SURF算法基礎(chǔ)
  2. opencv總SURF算法的使用

原理:

上節(jié)課使用了SIFT算法,當(dāng)時(shí)這種算法效率不高,需要更快速的算法。在06年有人提出了SURF算法“加速穩(wěn)定特征”,從名字上來看,他是SIFT算法的加速版本。

(原文)
在SIFT算法當(dāng)中使用高斯差分方程(Difference of Gaussian)對高斯拉普拉斯方程( Laplacian of Gaussian)進(jìn)行近似。然而,SURF使用盒子濾波器進(jìn)行近似,下面的圖片顯示了這種近似的方法。在進(jìn)行卷積計(jì)算的時(shí)候可以利用積分圖像,這是使用盒子形濾波器的一個(gè)優(yōu)點(diǎn),即計(jì)算某個(gè)窗口中的像素和的時(shí)候,計(jì)算量大小,也就是時(shí)間復(fù)雜度不受到窗口大小的影響。而且,這種運(yùn)算可以在不用的尺度空間當(dāng)中實(shí)現(xiàn)。

SURF算法計(jì)算關(guān)鍵點(diǎn)的尺度和位置信息使用Hessian矩陣實(shí)現(xiàn)。

(解釋)
文中的高斯拉普拉斯方程(算子)是檢測圖像中斑點(diǎn)的一種十分常用的方法。以一維高斯函數(shù)來檢測一維信號中的斑點(diǎn)為例。有一維信號f,高斯函數(shù)的一階導(dǎo)數(shù)ddxg" role="presentation">,信號與高斯函數(shù)的一階導(dǎo)數(shù)卷積后,會在邊緣處出現(xiàn)極值。如圖:

這里寫圖片描述 

上面圖片是在一維情況下,使用高斯函數(shù)的一階導(dǎo)數(shù)的情況,另一種方法是使用高斯函數(shù)的二階導(dǎo)數(shù)與信號進(jìn)行卷積,高斯函數(shù)的二階導(dǎo)數(shù)也叫做拉普拉斯變換。

但是,在一維信號斑點(diǎn)檢測的實(shí)際情況當(dāng)中,一個(gè)斑點(diǎn)可以考慮成是兩個(gè)相鄰的跳突組成,如下圖。

這里寫圖片描述 

類似于在圖像當(dāng)中,一個(gè)輪胎可以當(dāng)成一個(gè)斑點(diǎn),一個(gè)蒼蠅也可以當(dāng)成一個(gè)斑點(diǎn)。但是在使用高斯函數(shù)的二階導(dǎo)數(shù)來檢測斑點(diǎn)的時(shí)候,使用不同的高斯核(就是方差)運(yùn)算不同大小的斑點(diǎn)時(shí),計(jì)算出來的極值,即響應(yīng)值會出現(xiàn)衰減。

此時(shí),需要將高斯函數(shù)的二階導(dǎo)數(shù)進(jìn)行正規(guī)化,去除方差值不同導(dǎo)致響應(yīng)值出現(xiàn)的衰減。

以上,是一維高斯函數(shù)檢測一維信號的原理。二維的圖像信號,使用二維高斯函數(shù)來檢測斑點(diǎn)原理基本相同,此處的二維高斯函數(shù)的二階導(dǎo)數(shù),就叫做高斯拉普拉斯算子也就是LOG,通過改變不同的方差值,可以檢測不同尺寸的二維斑點(diǎn),如圖。

這里寫圖片描述

文中的高斯差分方程是SIFT算法當(dāng)中,發(fā)明者想要利用兩個(gè)相鄰高斯尺度空間的圖像相減來得到一個(gè)LOG的近似,因?yàn)檫@樣做可以節(jié)省時(shí)間,而且可以控制精度變化,類似于高等數(shù)學(xué)當(dāng)中泰勒公式那玩意-_- 。關(guān)于SIFT原理可以看上一篇博客

文中提到的積分圖像實(shí)際上原理非常簡單,類似遞推方程。積分圖像的目的是想建立一個(gè)函數(shù),能夠快速得到一個(gè)矩形圖像區(qū)域當(dāng)中所有像素值的和是多少。那么,設(shè)p(i,j)" role="presentation">表示從(0,0)" role="presentation">點(diǎn)到(i,j)" role="presentation">點(diǎn)的所有像素的和是多少,存儲在p(i,j)" role="presentation">這個(gè)數(shù)組里面,如果想要獲得W區(qū)域的像素和是多少,如圖,只要計(jì)算p(i4,j4)−p(i2,j2)−p(i3,j3)+p(i1,j1)" role="presentation">即可。

這里寫圖片描述 

如何求得p(i,j)" role="presentation">? 遞推公式為,p(i,j)=p(i−1,j)+p(i,j−1)+I(i,j)−p(i−1,j−1)" role="presentation">,這里面I(i,j)" role="presentation">表示像素點(diǎn)(i,j)" role="presentation">處的像素值。

文中提到的Hessian矩陣,學(xué)過數(shù)學(xué)分析、最優(yōu)化、機(jī)器學(xué)習(xí)之類的人肯定對這玩意非常熟悉,實(shí)際上黑塞矩陣就是一個(gè)多元函數(shù)的二階偏導(dǎo)數(shù)構(gòu)成的方陣,它的行列式值(Determinant of Hessian )可以反映的局部結(jié)構(gòu)信息,簡稱DOH。與LOG類似,DOH可以使用不同方差生成高斯函數(shù)對各個(gè)元的二階偏導(dǎo)模板,以此來對圖像進(jìn)行卷積運(yùn)算。 同樣,DOH也會在卷積后的函數(shù)中,得到對圖像信號斑點(diǎn)極值的響應(yīng)。如圖

這里寫圖片描述

在SURF算法當(dāng)中,黑塞矩陣中的L,即為二維高斯函數(shù)與圖像的卷積,求得黑塞矩陣后,會得到如圖。

這里寫圖片描述

將上面得到的模板與圖像的卷積轉(zhuǎn)換為盒子濾波器,這里使用原文中的圖像,如圖。

這里寫圖片描述

得到三個(gè)不同的盒子濾波器以后,對其進(jìn)行近似和簡化操作,并用其表示圖像中某點(diǎn)的斑點(diǎn)響應(yīng)值,遍歷圖像當(dāng)中的所有像素,就得到了在某一尺度下斑點(diǎn)檢測的響應(yīng)圖像。然后,利用不同的模板尺寸,獲取多尺度斑點(diǎn)響應(yīng)金字塔,在金字塔中搜索極值點(diǎn),下面的操作就和SIFT算法類似了。

(原文)
為了給找到的特征點(diǎn)賦予方向,以特征點(diǎn)為中心,6s為半徑獲取水平和垂直小波響應(yīng)運(yùn)算結(jié)果,這里s是特征點(diǎn)尺度,同時(shí)使用高斯加權(quán)的方法。然后,他們會被繪制在如下圖當(dāng)中。其中,特征點(diǎn)的主方向估計(jì)運(yùn)算是有一個(gè)弧度為60的扇形窗口,在滑動的過程中不斷計(jì)算其中的響應(yīng)值之和。有趣的是,小波響應(yīng)值在任意尺度下使用積分圖像很容易被獲取。但是在多數(shù)情況下,旋轉(zhuǎn)不變性不是必須的,可以代碼當(dāng)中將這一步取消,這樣還能夠提高算法計(jì)算速度,而且在+-15度的情況也保持穩(wěn)定,此時(shí)該方法稱作 U-SURF。用戶可以設(shè)置upright參數(shù),當(dāng)參數(shù)為0計(jì)算方向,參數(shù)為1不計(jì)算方向。

這里寫圖片描述

對于特征點(diǎn)描述的建立,SURF再一次使用Haar小波響應(yīng),同時(shí)使用積分圖像使操作變得簡單。在一個(gè)矩形區(qū)域當(dāng)中,以特征點(diǎn)為中心,劃取周圍20s×20s區(qū)域的大小,以特征點(diǎn)為原點(diǎn),主方向?yàn)闄M軸,分成四個(gè)子區(qū)域,每個(gè)子區(qū)域使用2s的Haar小波響應(yīng),對于每個(gè)子區(qū)域,獲取一個(gè)向量,記錄垂直、水平方向上的小波響應(yīng)值,如圖。

這里寫圖片描述 

這個(gè)特征描述符的長度使64,降低維度可以加速計(jì)算,又可以區(qū)分特征。為了更好的區(qū)分特征點(diǎn),SURF還使用了長度為128特征描述符。當(dāng)dy小于0或者大于0時(shí),計(jì)算dx或|dx|的和。同樣,根據(jù)dx的符號計(jì)算不同的dy和。因此能夠獲得雙倍的特征。計(jì)算復(fù)雜度也不會增加。opencv當(dāng)中的extended參數(shù)為0或1時(shí)分別對應(yīng)64和128的特征。

另外一個(gè)重要的改善是對潛在的興趣點(diǎn)使用了拉普拉斯算子符號(黑塞矩陣的跡)。由于之前的計(jì)算已經(jīng)完成對黑塞矩陣的構(gòu)造,所以這步不會增加復(fù)雜度。

拉普拉斯符號在不同明暗背景下區(qū)分不同亮度的斑點(diǎn),在匹配階段,我們只需要比較擁有相同對比度的特征是否匹配即可,這樣加快了計(jì)算速度,如圖。

這里寫圖片描述 

SURF算法的速度是SIFT速度的3倍,善于處理模糊和旋轉(zhuǎn)的圖像,但是不善于處理視角變化和關(guān)照變化。

(解釋)
文中的小波響應(yīng)運(yùn)算,全稱是haar小波運(yùn)算。這里使用haar小波目的是為了獲取圖像梯度,使用之前計(jì)算好的圖像積分結(jié)果,這樣能夠提高計(jì)算速度。與SIFT算法類似,在對每個(gè)特征點(diǎn)獲取主方向時(shí),使用原文中提到的一個(gè)π/3大小的扇形窗口,同時(shí)以0.2弧度為步長旋轉(zhuǎn)滑動此窗口,在每個(gè)窗口當(dāng)中對的haar響應(yīng)值的水平方向,垂直方向進(jìn)行累加。由于時(shí)使用一個(gè)圓形區(qū)域,轉(zhuǎn)換成類似極坐標(biāo)矢量的方式來表示,每個(gè)窗口中的結(jié)果(mw,θw)" role="presentation">,如圖。

這里寫圖片描述

主方向最大Haar響應(yīng)值累加對應(yīng)的方向。其中,如果除了主方向,還有其它方向的響應(yīng)累加值較大,算法當(dāng)中還會額外添加一個(gè)特征點(diǎn),并賦予另外一個(gè)次大方向。

文中建立的特征描述符顧名思義,就是描述一個(gè)特征點(diǎn)的一組向量,里面唯一確定了一個(gè)特征。SURF獲取主方向后,需要獲取特征點(diǎn)描述子。以特征點(diǎn)為原點(diǎn),主方向?yàn)闄M軸建立一個(gè)二維坐標(biāo)系,區(qū)域大小是20s×20s,分成是個(gè)之塊,每個(gè)子塊利用2s的haar模板進(jìn)行響應(yīng)計(jì)算。然后統(tǒng)計(jì)Σdx、Σ|dx|、Σdy、Σ|dy|" role="presentation">,每個(gè)20s的窗口分成4×4的子窗口,每個(gè)子窗口中又5s×5s個(gè)像元。如圖

這里寫圖片描述 

又4×4個(gè)子塊,每個(gè)子塊里面記錄四個(gè)值,所以描述子一共又4×4×4=64個(gè)特征。

最后將沿著主方向的小波響應(yīng)值扭轉(zhuǎn)過來,原理就是簡單的旋轉(zhuǎn)矩陣。

代碼部分

opencv里面提供的SURF算法和SIFT差不多,這兩個(gè)玩意都是受到版權(quán)保護(hù)的,如果你是用pip 一條命令安裝的opencv,那么恭喜你用不了SURF和SIFT算法,印象中只有2.4.9版本的opencv庫才可以使用。

不過,辦法還是有的,再控制臺當(dāng)中輸入pip install opencv-contrib-python 就可以用了。

如果還是無法安裝,可以直接網(wǎng)站早opencv-contrib-python的輪子,然后放到對應(yīng)的文件下安裝就行了。

我的版本是opencv 3.2,和教程文檔中的使用方法不同。

詳細(xì)參數(shù)可以自己去查一查,一查一個(gè)準(zhǔn)的

https://docs.opencv.org/master/d5/df7/classcv_1_1xfeatures2d_1_1SURF.html

import cv2 
import numpy as np 

img = cv2.imread('feng.jpg')

#參數(shù)為hessian矩陣的閾值
surf = cv2.xfeatures2d.SURF_create(400)
#找到關(guān)鍵點(diǎn)和描述符
key_query,desc_query = surf.detectAndCompute(img,None)
#把特征點(diǎn)標(biāo)記到圖片上
img=cv2.drawKeypoints(img,key_query,img)

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

這里寫圖片描述

鳳的嘴上特征點(diǎn)占了這么多,辨識度還是蠻高的~ -_-|||

下面是設(shè)置方向,和輸出一些值的方法

import cv2 
import numpy as np 

img = cv2.imread('feng.jpg')

#參數(shù)為hessian矩陣的閾值
surf = cv2.xfeatures2d.SURF_create(4000)

#設(shè)置是否要檢測方向
surf.setUpright(True)

#輸出設(shè)置值
print(surf.getUpright())

#找到關(guān)鍵點(diǎn)和描述符
key_query,desc_query = surf.detectAndCompute(img,None)

img=cv2.drawKeypoints(img,key_query,img)

#輸出描述符的個(gè)數(shù)
print(surf.descriptorSize())


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

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

相關(guān)文章

  • python批量翻譯excel表格中的英文

    python批量翻譯excel表格中的英文

    本文主要介紹了python批量翻譯excel表格中的英文,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 使用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    使用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了使用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 如何用scheduler實(shí)現(xiàn)learning-rate學(xué)習(xí)率動態(tài)變化

    如何用scheduler實(shí)現(xiàn)learning-rate學(xué)習(xí)率動態(tài)變化

    這篇文章主要介紹了如何用scheduler實(shí)現(xiàn)learning-rate學(xué)習(xí)率動態(tài)變化問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python實(shí)現(xiàn)數(shù)據(jù)庫編程方法詳解

    Python實(shí)現(xiàn)數(shù)據(jù)庫編程方法詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)數(shù)據(jù)庫編程方法,較為詳細(xì)的總結(jié)了Python數(shù)據(jù)庫編程涉及的各種常用技巧與相關(guān)組件,需要的朋友可以參考下
    2015-06-06
  • 教你使用Pycharm配置遠(yuǎn)程Jupyter

    教你使用Pycharm配置遠(yuǎn)程Jupyter

    在pycharm里配置了遠(yuǎn)程的Python解釋器,然后在使用過程中,發(fā)現(xiàn)pycharm原來是可以使用Jupyter的文件,而且還可以配置遠(yuǎn)程的Jupyter環(huán)境,今天試了一下,一開始還是走了一些坑,今天梳理一下,需要的朋友可以參考下
    2022-05-05
  • python如何寫出表白程序

    python如何寫出表白程序

    在本篇文章里小編給大家分享的是一篇關(guān)于python實(shí)現(xiàn)表白程序的代碼實(shí)例,需要的朋友們可以參考下。
    2020-06-06
  • Python讀取txt內(nèi)容寫入xls格式excel中的方法

    Python讀取txt內(nèi)容寫入xls格式excel中的方法

    今天小編就為大家分享一篇Python讀取txt內(nèi)容寫入xls格式excel中的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 在django admin中配置搜索域是一個(gè)外鍵時(shí)的處理方法

    在django admin中配置搜索域是一個(gè)外鍵時(shí)的處理方法

    這篇文章主要介紹了在django admin中配置搜索域是一個(gè)外鍵時(shí)的處理方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Anaconda修改默認(rèn)虛擬環(huán)境安裝位置的方案分享

    Anaconda修改默認(rèn)虛擬環(huán)境安裝位置的方案分享

    新安裝Anaconda后,在創(chuàng)建環(huán)境時(shí)環(huán)境自動安裝在C盤,但是C盤空間有限,下面這篇文章主要給大家介紹了關(guān)于Anaconda修改默認(rèn)虛擬環(huán)境安裝位置的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python實(shí)現(xiàn)感知器

    python實(shí)現(xiàn)感知器

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)感知器的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論