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