python-opencv图像处理之SURF函数
在SIFT中,Lowe用高斯差近似高斯的拉普拉斯算子來尋找尺度空間。SURF走得更遠(yuǎn),使用Box Filter近似LoG。下圖顯示了這種近似值的演示。這種近似的一大優(yōu)點是,借助積分圖像可以輕松地計算出帶盒濾波器的卷積。并且可以針對不同規(guī)模并行執(zhí)行。SURF還依賴于Hessian矩陣的行列式來確定尺度和位置。
對于方向分配,SURF在水平和垂直方向上對大小為6s的鄰域使用小波響應(yīng)。適當(dāng)?shù)母咚箼?quán)重也適用于它。然后將它們繪制在下圖所示的空間中。通過計算角度為60度的滑動方向窗口內(nèi)所有響應(yīng)的總和,可以估算主導(dǎo)方向。有趣的是,小波響應(yīng)可以很容易地使用積分圖像在任何規(guī)模下發(fā)現(xiàn)。對于許多應(yīng)用,不需要旋轉(zhuǎn)不變性,因此無需查找此方向,從而加快了過程。SURF提供了稱為Upright-SURF或U-SURF的功能。它提高了速度,并具有高達(dá)±15°\pm 15^{\circ}±15°的魯棒性。OpenCV根據(jù)標(biāo)志支持兩種方式。如果為0,則計算方向。如果為1,則不計算方向并且速度更快。
對于功能描述,SURF在水平和垂直方向上使用小波響應(yīng)(同樣,使用積分圖像使事情變得更容易)。在s是大小的關(guān)鍵點周圍采用大小為20sX20s的鄰域。它分為4x4子區(qū)域。對于每個子區(qū)域,獲取水平和垂直小波響應(yīng),并像這樣形成向量,v=(∑dx,∑dy,∑∣dx∣,∑∣dy∣)v =(\sum dx,\sum dy,\sum |dx|,\sum |dy|)v=(∑dx,∑dy,∑∣dx∣,∑∣dy∣)。當(dāng)表示為向量時,這將為SURF特征描述符提供總共64個維度。尺寸越小,計算和匹配速度越快,但特征的區(qū)分性更好。
為了更加獨特,SURF特征描述符具有擴(kuò)展的128維版本。dx和∣dx∣|dx|∣dx∣的和分別針對dy<0dy<0dy<0和dy≥0dy≥0dy≥0進(jìn)行計算。同樣,dydydy和∣dy∣|dy|∣dy∣的總和 根據(jù)dxdxdx的符號進(jìn)行拆分,從而使特征數(shù)量加倍。它不會增加太多的計算復(fù)雜性。OpenCV通過將分別為64-dim和128-dim(默認(rèn)值為128-dim)的標(biāo)志的值設(shè)置為0和1來支持這兩者(默認(rèn)為128-dim)。
另一個重要的改進(jìn)是對基礎(chǔ)興趣點使用了Laplacian算符(海森矩陣的跡)。它不增加計算成本,因為它已在檢測期間進(jìn)行了計算。拉普拉斯算子的標(biāo)志將深色背景上的明亮斑點與相反的情況區(qū)分開。在匹配階段,我們僅比較具有相同對比類型的特征(如下圖所示)。這些最少的信息可加快匹配速度,而不會降低描述符的性能。
簡而言之,SURF添加了許多功能來提高每一步的速度。分析表明,它的速度是SIFT的3倍,而性能卻與SIFT相當(dāng)。SURF擅長處理具有模糊和旋轉(zhuǎn)的圖像,但不擅長處理視點變化和照明變化。
OpenCV中的SURF
OpenCV提供類似于SIFT的SURF功能。您可以使用一些可選條件(例如64 / 128-dim描述符,Upright / Normal SURF等)來啟動SURF對象。所有詳細(xì)信息在docs中都有詳細(xì)說明。然后,就像在SIFT中所做的那樣,我們可以使用SURF.detect(),SURF.compute()等來查找關(guān)鍵點和描述符。
首先,我們將看到一個有關(guān)如何找到SURF關(guān)鍵點和描述符并進(jìn)行繪制的簡單演示。所有示例都在Python終端中顯示,因為它與SIFT相同。
img = cv.imread('fly.png',0) # 創(chuàng)建SURF對象。你可以在此處或以后指定參數(shù)。 # 這里設(shè)置海森矩陣的閾值為400 >>> surf = cv.xfeatures2d.SURF_create(400) # 直接查找關(guān)鍵點和描述符 >>> kp, des = surf.detectAndCompute(img,None) >>> len(kp)699圖片中無法顯示1199個關(guān)鍵點。我們將其減少到50左右以繪制在圖像上。匹配時,我們可能需要所有這些功能,但現(xiàn)在不需要。因此,我們增加了海森閾值。
# 檢查海森矩陣閾值 >>> print( surf.getHessianThreshold() ) 400.0 # 我們將其設(shè)置為50000。記住,它僅用于表示圖片。 # 在實際情況下,最好將值設(shè)為300-500 >>> surf.setHessianThreshold(50000) # 再次計算關(guān)鍵點并檢查其數(shù)量。 >>> 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更像是斑點檢測器。它檢測到蝴蝶翅膀上的白色斑點。您可以使用其他圖像進(jìn)行測試。
所有的方向都顯示在同一個方向上。它比以前更快了。如果你工作的情況下,方向不是一個問題(如全景拼接)等,這是更好的。
最后,我們檢查描述符的大小,如果只有64維,則將其更改為128。
其余部分是匹配的。
總結(jié)
以上是生活随笔為你收集整理的python-opencv图像处理之SURF函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新的吉尼斯世界纪录 – 最快人类基因组测
- 下一篇: mySQL(关系型数据库管理系统)编辑