SIFT算法是一种与图像比例无关的角点检测算法。
该函数会对不同的图像尺度(尺度不变特征变换)输出相同的结果。
而SURF算法吸收了SIFT算法的思想,速度比SIFT快好几倍。
下面我会将两个算法整合在一个程序中:
import cv2
import numpy as np
img = cv2.imread('varese.jpg')#读取要处理的图片
alg = input('Select an Alg --> ')
def fd(algorithm):
if algorithm == 'SIFT':
return cv2.xfeatures2d.SIFT_create()
if algorithm == 'SURF':
threshold = input('Enter a threshold --> ')#提示输入SURF算法所采用的阈值
return cv2.xfeatures2d.SURF_create(float(threshold))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图像
fd_alg = fd(alg)
keypoints,descriptor = fd_alg.detectAndCompute(gray,None)#进行算法的检测和计算
img = cv2.drawKeypoints(image = img,outImage = img,keypoints = keypoints,
flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
color = (51,163,236))
cv2.imshow('keypoints',img)
while(True):
if cv2.waitKey(30) & 0xff == ord('q'):
break
cv2.destroyAllWindows()
注意:本次程序中使用了input函数,本人在使用命令行运行该程序时出现报错,而使用默认的sublime运行时是无法进行输入交互的。因此可以通过下载sublimeREPL插件来解决这个问题。
安装插件方法请参考:点击打开链接
原图像:
SIFT处理后:
SURF处理后:
本次SURF处理使用的阈值为8000,阈值越高,能识别的特征就越少。
自己可以采用试探法来得到最优的检测。
我本人也是正在学习opencv,本篇文章仅作为自己学习过程的记录。
如有错漏,请大牛们帮忙指出。一起探讨学习!