日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python-opencv图像处理之SURF函数

發布時間:2025/3/15 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python-opencv图像处理之SURF函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在SIFT中,Lowe用高斯差近似高斯的拉普拉斯算子來尋找尺度空間。SURF走得更遠,使用Box Filter近似LoG。下圖顯示了這種近似值的演示。這種近似的一大優點是,借助積分圖像可以輕松地計算出帶盒濾波器的卷積。并且可以針對不同規模并行執行。SURF還依賴于Hessian矩陣的行列式來確定尺度和位置。

對于方向分配,SURF在水平和垂直方向上對大小為6s的鄰域使用小波響應。適當的高斯權重也適用于它。然后將它們繪制在下圖所示的空間中。通過計算角度為60度的滑動方向窗口內所有響應的總和,可以估算主導方向。有趣的是,小波響應可以很容易地使用積分圖像在任何規模下發現。對于許多應用,不需要旋轉不變性,因此無需查找此方向,從而加快了過程。SURF提供了稱為Upright-SURF或U-SURF的功能。它提高了速度,并具有高達±15°\pm 15^{\circ}±15°的魯棒性。OpenCV根據標志支持兩種方式。如果為0,則計算方向。如果為1,則不計算方向并且速度更快。

對于功能描述,SURF在水平和垂直方向上使用小波響應(同樣,使用積分圖像使事情變得更容易)。在s是大小的關鍵點周圍采用大小為20sX20s的鄰域。它分為4x4子區域。對于每個子區域,獲取水平和垂直小波響應,并像這樣形成向量,v=(∑dx,∑dy,∑∣dx∣,∑∣dy∣)v =(\sum dx,\sum dy,\sum |dx|,\sum |dy|)v=(dx,dy,dx,dy)。當表示為向量時,這將為SURF特征描述符提供總共64個維度。尺寸越小,計算和匹配速度越快,但特征的區分性更好。

為了更加獨特,SURF特征描述符具有擴展的128維版本。dx和∣dx∣|dx|dx的和分別針對dy<0dy<0dy<0dy≥0dy≥0dy0進行計算。同樣,dydydy∣dy∣|dy|dy的總和 根據dxdxdx的符號進行拆分,從而使特征數量加倍。它不會增加太多的計算復雜性。OpenCV通過將分別為64-dim和128-dim(默認值為128-dim)的標志的值設置為0和1來支持這兩者(默認為128-dim)。

另一個重要的改進是對基礎興趣點使用了Laplacian算符(海森矩陣的跡)。它不增加計算成本,因為它已在檢測期間進行了計算。拉普拉斯算子的標志將深色背景上的明亮斑點與相反的情況區分開。在匹配階段,我們僅比較具有相同對比類型的特征(如下圖所示)。這些最少的信息可加快匹配速度,而不會降低描述符的性能。

簡而言之,SURF添加了許多功能來提高每一步的速度。分析表明,它的速度是SIFT的3倍,而性能卻與SIFT相當。SURF擅長處理具有模糊和旋轉的圖像,但不擅長處理視點變化和照明變化。
OpenCV中的SURF

OpenCV提供類似于SIFT的SURF功能。您可以使用一些可選條件(例如64 / 128-dim描述符,Upright / Normal SURF等)來啟動SURF對象。所有詳細信息在docs中都有詳細說明。然后,就像在SIFT中所做的那樣,我們可以使用SURF.detect(),SURF.compute()等來查找關鍵點和描述符。

首先,我們將看到一個有關如何找到SURF關鍵點和描述符并進行繪制的簡單演示。所有示例都在Python終端中顯示,因為它與SIFT相同。

img = cv.imread('fly.png',0) # 創建SURF對象。你可以在此處或以后指定參數。 # 這里設置海森矩陣的閾值為400 >>> surf = cv.xfeatures2d.SURF_create(400) # 直接查找關鍵點和描述符 >>> kp, des = surf.detectAndCompute(img,None) >>> len(kp)699

圖片中無法顯示1199個關鍵點。我們將其減少到50左右以繪制在圖像上。匹配時,我們可能需要所有這些功能,但現在不需要。因此,我們增加了海森閾值。

# 檢查海森矩陣閾值 >>> print( surf.getHessianThreshold() ) 400.0 # 我們將其設置為50000。記住,它僅用于表示圖片。 # 在實際情況下,最好將值設為300-500 >>> surf.setHessianThreshold(50000) # 再次計算關鍵點并檢查其數量。 >>> kp, des = surf.detectAndCompute(img,None) >>> print( len(kp) ) 47

它小于50。讓我們在圖像上繪制它。

>>> img2 = cv.drawKeypoints(img,kp,None,(255,0,0),4) >>> plt.imshow(img2),plt.show()

您可以看到SURF更像是斑點檢測器。它檢測到蝴蝶翅膀上的白色斑點。您可以使用其他圖像進行測試。

# 檢查flag標志,如果為False,則將其設置為True >>> print( surf.getUpright() ) False >>> surf.setUpright(True) # 重新計算特征點并繪制 >>> kp = surf.detect(img,None) >>> img2 = cv.drawKeypoints(img,kp,None,(255,0,0),4) >>> plt.imshow(img2),plt.show()

所有的方向都顯示在同一個方向上。它比以前更快了。如果你工作的情況下,方向不是一個問題(如全景拼接)等,這是更好的。

最后,我們檢查描述符的大小,如果只有64維,則將其更改為128。

# 找到算符的描述 >>> print( surf.descriptorSize() ) 64 # 表示flag “extened” 為False。 >>> surf.getExtended()False # 因此,將其設為True即可獲取128個尺寸的描述符。 >>> surf.setExtended(True) >>> kp, des = surf.detectAndCompute(img,None) >>> print( surf.descriptorSize() ) 128 >>> print( des.shape ) (47, 128)

其余部分是匹配的。

總結

以上是生活随笔為你收集整理的python-opencv图像处理之SURF函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。