Edward Rosten & Tom Drummond于2006年提出的,通过机器学习与角点检测相互融合,实现快速高效检测角点。
fast角点检测具体实现:
该算法考虑以角点p为中心的圆,其边与图像像素点相交的像素位置,例如上图边所在的16个像素位置,如果存在一组n个连续的像素点其灰度值全部大于p点灰度值加上阈值或者全部小于p点灰度值减掉阈值,那么p即为角点。
论文中n被设定为12,经过大量测试得出,因为n=12可以排除大量非角点。
对于这16个像素位置,总共只有三种状态:
或比p亮,或比p暗,或者与p相似(基于灰度值)。
然而一个图像如果拿16个点依次按照上述公式计算比较,那算法简直太慢,作者提出运用ID3决策树(通过信息增益进行泛化评估)进行泛化,来寻找是否存在这连续的n个pixels或大于或小于
I
p
±
t
I_p\pm t
Ip±t 。
另外算法采用了非极大值抑制,对检测到的每个角点计算得分函数V,并对其应用非极大值抑制以去除具有较高V的相邻角点的角点,即去除冗余,选择最优的角点。
通过计算得分函数V,将得到的值分别与候选角点的相邻角点的值进行比较,将较小的角点全部去掉。
opencv封装了该算法,代码如下:
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread("building.jpg")
image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
fast = cv.FastFeatureDetector_create(threshold=30, nonmaxSuppression=True, type=cv.FAST_FEATURE_DETECTOR_TYPE_9_16)
features_pos = fast.detect(image, None)
draw_image = cv.drawKeypoints(image, features_pos, image, color=(0, 255, 0))
plt.imshow(draw_image)
plt.xticks([])
plt.yticks([])
plt.show()
FastFeatureDetector_create()
中的threshold
即为上述的阈值t,threshold
越小检测出的角点越多,值越大检测出的角点越少,第二个设置是否进行非极大值抑制。
threshold分别等于30和100时角点的检测结果。
缺点:
鲁棒性较差,容易受到噪声的扰动;取决于阈值t,需要根据不同的情况进行调参。