使用SIFT算法和SURF算法来提取和检测特征(python语言实现)

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算法来提取和检测特征(python语言实现)_第1张图片

SIFT处理后:


SURF处理后:


本次SURF处理使用的阈值为8000,阈值越高,能识别的特征就越少。

自己可以采用试探法来得到最优的检测。


我本人也是正在学习opencv,本篇文章仅作为自己学习过程的记录。

如有错漏,请大牛们帮忙指出。一起探讨学习!

你可能感兴趣的:(使用SIFT算法和SURF算法来提取和检测特征(python语言实现))