特徵點檢測在影像視覺中常被使用到,尤其追求商品化的過程中,往往需要效率高的演算法,Fast演算法常被使用到.
FAST特徵檢測算法來源於corner角點的定義,這個定義基於特徵點周圍的圖像灰度值,檢測候選特徵點周圍一圈的像素值,如果候選點周圍領域內有足夠多的像素點與該候選點的灰度值差別夠大,則認為該候選點為一個特徵點。
I(x)為圓周(下圖繪說明圓周的概念)上任意一點的灰度值,I(p)為圓心的灰度值,Ed為所定義灰度值差(一般至少為10),如果N大於給定閾值,一般為圓周點數的四分之三,則認為p是一個特徵點。
為了達到更快速度,OPENCV的FAST會先判斷p點周圍上下左右四點,如果大於三點超過定義灰度值差,再繼續跑FAST.
下圖以圓周=3,判斷圓每一個在圓周上的16點,通常會以判斷N個點稱為FAST-N,常用的是FAST-9.
以下是OPENCV官網提供PYTHON範例
import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('simple.jpg',0) # Initiate FAST object with default values fast = cv2.FastFeatureDetector() # find and draw the keypoints kp = fast.detect(img,None) img2 = cv2.drawKeypoints(img, kp, color=(255,0,0)) # Print all default params print "Threshold: ", fast.getInt('threshold') print "nonmaxSuppression: ", fast.getBool('nonmaxSuppression') print "neighborhood: ", fast.getInt('type') print "Total Keypoints with nonmaxSuppression: ", len(kp) cv2.imwrite('fast_true.png',img2) # Disable nonmaxSuppression fast.setBool('nonmaxSuppression',0) kp = fast.detect(img,None) print "Total Keypoints without nonmaxSuppression: ", len(kp) img3 = cv2.drawKeypoints(img, kp, color=(255,0,0)) cv2.imwrite('fast_false.png',img3)
上圖為處理過後的結果圖, 但因FAST是根據像素的灰度差值計算特徵點, 在雜訊NOISE高的影像中,會使FAST常抓錯特徵點.
文章標籤
全站熱搜