计算机视觉专栏传送
上一篇:图像特征算法(一)——SIFT算法简述及Python标记SIFT特征检测实践
下一篇:图像特征算法(三)——ORB算法简述及Python中ORB特征匹配实践
一、SURF算法
1.算法简介
SURF(Speeded-Up Robust Features)加速稳健特征,是一种稳健的局部特征点检测和描述算法。
SURF是对SIFT算法的改进,该算子在保持 SIFT 算子优良性能特点的基础上,同时解决了 SIFT 计算复杂度高、耗时长的缺点,提升了算法的执行效率,为算法在实时计算机视觉系统中应用提供了可能。
2.SURF与SIFT的具体差异
(1)在生成尺度空间方面,SIFT中下一组图像的尺寸是上一组的一半,同一组间图像尺寸一样,但是所使用的高斯模糊系数逐渐增大。而在SURF中,不同组间图像的尺寸都是一致的,但不同组间使用的盒式滤波器的模板尺寸逐渐增大,同一组间不同层间使用相同尺寸的滤波器,但是滤波器的模糊系数逐渐增大。
(2)在特征点检验时,SIFT算子是先对图像进行非极大值抑制,再去除对比度较低的点。然后通过Hessian矩阵去除边缘的点。SURF算法是先通过Hessian矩阵来检测候选特征点,然后再对非极大值的点进行抑制。
(3)在特征向量的方向确定上,SIFT算法是在正方形区域内统计梯度的幅值的直方图,找到最大梯度幅值所对应的方向。SIFT算子确定的特征点可以有一个或一个以上方向,其中包括一个主方向与多个辅方向。SURF算法则是在圆形邻域内,检测各个扇形范围内水平、垂直方向上的Haar小波响应,找到模值最大的扇形指向,且该算法的方向只有一个。
(4)SIFT算法生成描述子时,是将16x16的采样点划分为4x4的区域,从而计算每个分区种子点的幅值并确定其方向,共计4x4x8=128维。SURF算法在生成特征描述子时将的正方形分割成4x4的小方格,每个子区域25个采样点,计算小波haar响应,一共4x4x4=64维。
综上,SURF算法在各个步骤上都简化了一些繁琐的工作,仅仅计算了特征点的一个主方向,生成的特征描述子也与前者相比降低了维数。
二、Python代码实践
1.测试环境
(1)pycharm下python3.7.6
(2)opencv-python 3.4.2.16
(3)opencv-contrib-python 3.4.2.16
2.测试代码
import cv2 as cv
img = cv.imread("C:/Users/dell/Desktop/lena512color.png")
surf = cv.xfeatures2d.SURF_create(7000)
kp, des = surf.detectAndCompute(img,None)
img2 = cv.drawKeypoints(img,kp,None,(255,0,0),4)
cv.imshow('surf', img2)
cv.waitKey(0)
cv.destroyAllWindows()
3.核心函数
(1)cv2.xfeatures2d.SURF_create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright)
生成关键点的函数
- hessianThreshold:默认100,关键点检测的阈值,越高监测的点越少
- nOctaves:默认4,金字塔组数
- nOctaveLayers:默认3,每组金子塔的层数
- extended:默认False,扩展描述符标志,True表示使用扩展的128个元素描述符,False表示使用64个元素描述符。
- upright:默认False,垂直向上或旋转的特征标志,True表示不计算特征的方向,False-计算方向。
(2)cv2.drawKeypoint(image, keypoints, outImage, color, flags)
在图像中标记关键点的函数
- image:输入图像
- keypoints:获取的特征点
- outImage:输出图像
- color:颜色,默认为随机颜色
- flags:绘制点的模式,有下图所示四种模式
4.测试结果
上图即利用SURF算法检测到的图像特征点,各圆圆心即为检测到的特征点,各圆中的直线即分别标记了各个特征点的主方向。
上一篇:图像特征算法(一)——SIFT算法简述及Python标记SIFT特征检测实践
下一篇:图像特征算法(三)——ORB算法简述及Python中ORB特征匹配实践