1.SURF 特征检测
1.1 SURF的来源
Speeded Up Robust Features(SURF,加速稳健特征),是一种稳健的局部特征点检测和描述算法。最初由Herbert Bay发表在2006年的欧洲计算机视觉国际会议(Europen Conference on Computer Vision,ECCV)上,并在2008年正式发表在Computer Vision and Image Understanding期刊上。
Surf是对David Lowe在1999年提出的Sift算法的改进,提升了算法的执行效率,为算法在实时计算机视觉系统中应用提供了可能。
SIFT最大的问题就是速度慢, 因此才有了SURF.
如果想对一系列的图片进行快速的特征检测, 使用SIFT会非常慢.
1.2 SURF原理简介
SURF特征是一种图像的局部特征,当目标图像发生旋转、尺度缩放、亮度变化时,具有保持不变性,并且对视角变化、仿射变换和噪声等也具有保持一定程度的稳定性。SURF特征提取算法的流程主要包括:特征点检测、特征点描述和特征点匹配三部分。特征点检测采用了基于Hessian矩阵的检测器,其在稳定性和可重复性方面都优于基于Harris的检测器。特征点描述采用Haar小波作为特征描述子,由于Harr特征最大的特点是速度快,能减少计算时间且增加稳健性。用方框滤波近似代替二阶高斯滤波,运用积分图像加速卷积,减少了时间计算的复杂度,提高了计算速度。
SURF的计算流程:
1.3 SURF 的步骤
-
1, 积分图像。积分图像是对原始图像的一种特征表示方法,表示图像某一区域的灰度值总和。
-
2, 尺度空间的建立。对图像进行预处理时,使用箱式滤波器对高斯核近似,由于其在计算卷积时的计算量与滤波器大小无关,因此可以极大的提高算法运行速度。通过改变滤波器的大小,得到尺度空间。
-
3, 快速Hessian特征检测。由Hessian矩阵来进行图像极值点的检测,首先根据特征值计算出来的行列式的符号对极值点进行判别。然后根据值得正或负判断该点是不是局部极值点。如果行列式是正的,那么特征值全为正或者全为负,故该点是极值点。
-
4, 尺度空间的构造。SURF将尺度空间划分成若干组。一个组代表了逐步放大的滤波模板对同一个输入图像进行滤波的一系列响应图像。每一组又有若干固定的层组成。
-
5, 特征点的精确定位。对于处于某尺度图像下的某一个关键点,用Hessian矩阵求出极值后,在立方体邻域内进行非最大值抑制,然后在尺度空间和图像空间进行插值运算,得到稳定特征点的位置和所在的尺度值。
注意: SURF在较新版本的OpenCV中已经申请专利, 需要降OpenCV版本才能使用. 降到3.4.1.15就可以用了.
SURF 基于OpenCV实现
import cv2
import numpy as np
img = cv2.imread('chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建SURF对象
surf = cv2.xfeatures2d.SURF_create()
# 进行检测
kp = surf.detect(gray)
# 检测关键点, 并计算描述子
kp, des = surf.compute(img, kp)
# 或者一步到位, 把关键点和描述子一起检测出来.
kp, des = surf.detectAndCompute(img, None)
# print(kp)
print(des)
print(des.shape)
# 绘制关键点
cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()