用于角点检测的FAST算法
使用FAST進(jìn)行特征檢測(cè)
1.選擇圖像中是否要識(shí)別為興趣點(diǎn)的像素ppp,使其強(qiáng)度為IpI_pIp?
2.選擇適當(dāng)?shù)拈撝?span id="ze8trgl8bvbq" class="katex--inline">ttt
3.考慮被測(cè)像素周圍有16個(gè)像素的圓圈。(見(jiàn)下圖)
4.現(xiàn)在,如果圓中存在一組(共16個(gè)像素)nnn個(gè)連續(xù)的像素,它們均比Ip+tI_p + tIp?+t亮,或者比Ip?tI_p-tIp??t都暗,則像素ppp是一個(gè)角。(在上圖中顯示為白色虛線)。n被選為12。
5.建議使用高速測(cè)試以排除大量的非角區(qū)域。此測(cè)試僅檢查1、9、5和13處的四個(gè)像素(如果第一個(gè)1和9太亮或太暗,則對(duì)其進(jìn)行測(cè)試。如果是,則檢查5和13)。如果p是一個(gè)角,則其中至少三個(gè)必須全部比Ip+tI_p + tIp?+t亮或比Ip?tI_p-tIp??t暗。如果以上兩種情況都不是,則ppp不能為角。然后,可以通過(guò)檢查圓中的所有像素,將完整的分段測(cè)試標(biāo)準(zhǔn)應(yīng)用于通過(guò)的候選項(xiàng)。該檢測(cè)器本身具有很高的性能,但有幾個(gè)缺點(diǎn):
6.它不會(huì)拒絕n <12的候選對(duì)象。
7.像素的選擇不是最佳的,因?yàn)槠湫嗜Q于問(wèn)題的順序和角落外觀的分布。
8.高速測(cè)試的結(jié)果被丟棄了。
9.彼此相鄰地檢測(cè)到多個(gè)特征。
機(jī)器學(xué)習(xí)的方法解決了前三點(diǎn)。使用非最大抑制來(lái)解決最后一個(gè)問(wèn)題。
讓機(jī)器學(xué)習(xí)一個(gè)角檢測(cè)器
1.選擇一組圖像進(jìn)行訓(xùn)練(最好從目標(biāo)應(yīng)用程序域中進(jìn)行訓(xùn)練)
2.在每個(gè)圖像中運(yùn)行FAST算法以查找特征點(diǎn)。
3.對(duì)于每個(gè)特征點(diǎn),將其周圍的16個(gè)像素存儲(chǔ)為矢量。對(duì)所有圖像執(zhí)行此操作以獲得特征向量P。
4.這16個(gè)像素中的每個(gè)像素(例如xxx)可以具有以下三種狀態(tài)之一:
1.取決于這些狀態(tài),特征矢量PPP被細(xì)分為3個(gè)子集,PdP_dPd?, PsP_sPs?, PbP_bPb?。
2.定義一個(gè)新的布爾變量KpK_pKp?,如果ppp是一個(gè)角,則為true,否則為false。
3.使用ID3算法(決策樹(shù)分類器)使用變量KpK_pKp?查詢每個(gè)子集,以獲取有關(guān)真實(shí)類的知識(shí)。它選擇x,該x通過(guò)KpK_pKp?的熵測(cè)得的有關(guān)候選像素是否為角的信息最多。
4.遞歸地將其應(yīng)用于所有子集,直到其熵為零為止。
5.這樣創(chuàng)建的決策樹(shù)用于其他圖像的快速檢測(cè)。
非最大抑制
在相鄰位置檢測(cè)多個(gè)興趣點(diǎn)是另一個(gè)問(wèn)題。通過(guò)使用非極大抑制來(lái)解決。
1.計(jì)算所有檢測(cè)到的特征點(diǎn)的得分函數(shù)VVV。VVV是ppp與16個(gè)周圍像素值之間的絕對(duì)差之和。
2.考慮兩個(gè)相鄰的關(guān)鍵點(diǎn)并計(jì)算它們的VVV值。
3.丟棄較低VVV值的那個(gè)。
OpenCV中的高速拐角檢測(cè)器
它被稱為OpenCV中的任何其他特征檢測(cè)器。 如果需要,您可以指定閾值,是否要應(yīng)用非極大抑制,要使用的鄰域等。 對(duì)于鄰域,定義了三個(gè)標(biāo)志,分別為cv.FAST_FEATURE_DETECTOR_TYPE_5_8,cv.FAST_FEATURE_DETECTOR_TYPE_7_12和cv.FAST_FEATURE_DETECTOR_TYPE_9_16。 以下是有關(guān)如何檢測(cè)和繪制FAST特征點(diǎn)的簡(jiǎn)單代碼。
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('simple.jpg',0) # 用默認(rèn)值初始化FAST對(duì)象 fast = cv.FastFeatureDetector_create() # 尋找并繪制關(guān)鍵點(diǎn) kp = fast.detect(img,None) img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0)) # 打印所有默認(rèn)參數(shù) print( "Threshold: {}".format(fast.getThreshold()) ) print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) ) print( "neighborhood: {}".format(fast.getType()) ) print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) ) cv.imwrite('fast_true.png',img2) # 關(guān)閉非極大抑制 fast.setNonmaxSuppression(0) kp = fast.detect(img,None) print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) ) img3 = cv.drawKeypoints(img, kp, None, color=(255,0,0)) cv.imwrite('fast_false.png',img3)查看結(jié)果。第一張圖片顯示了帶有nonmaxSuppression的FAST,第二張圖片顯示了沒(méi)有nonmaxSuppression的FAST.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的用于角点检测的FAST算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: opencv 车道线检测(一)
- 下一篇: 理解Netty中的零拷贝(Zero-Co