关于一些角点检测技术,比如 Harris 等。它们具有旋转不变特性,即使图片发生了旋转,我们也能找到同样的角点,但如果进行图像缩放,如图,原来的角点就不在是角点了,所以在 2004 年,D.Lowe 提出了一个新的算法:尺度不变特征变换(SIFT) ,这个算法可以帮助我们提取图像中的关键点并计算它们的描述符。
import cv2
import numpy as np
img = cv2.imread('H:/python workplays/cv aaa/6.png')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)
img=cv2.drawKeypoints(gray,kp,img,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite('sift_keypoints.jpg',img)
注:
代码如下:
import cv2
img = cv2.imread('test3.jpg')
sift = cv2.SIFT()
会报错:
Traceback (most recent call last):
File "F:/PyCharm/pydir/t3.py", line 4, in
sift = cv2.SIFT()
AttributeError: module 'cv2' has no attribute 'SIFT'
SURF(加速稳健特征)这种算法执行速度比SIFT快。
在 SIFT 中, Lowe 在构建尺度空间时使用 DoG 对 LoG 进行近似。 SURF使用盒子滤波器(box_filter)对 LoG 进行近似。在进行卷积计算时可以利用积分图像(积分图像的一大特点是:计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关) ,是盒子滤波器的一大优点。而且这种计算可以在不同尺度空间同时进行。同样 SURF 算法计算关键点的尺度和位置是也是依赖与 Hessian 矩阵行列式的。
SURF 算法采用了很多方法来对每一步进行优化从而提高速度。分析显示在结果效果相当的情况下 SURF 的速度是 SIFT 的 3 倍。SURF 善于处理具有模糊和旋转的图像,但是不善于处理视角变化和关照变化。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('H:/python workplays/cv aaa/6.png')
#参数为hessian矩阵的阈值
surf = cv2.xfeatures2d.SURF_create(400)
#找到关键点和描述符
kp, des = surf.detectAndCompute(img,None)
#把特征点标记到图片上
img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
plt.imshow(img2),plt.show()
设置方向和输出值:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('H:/python workplays/cv aaa/6.png')
#参数为hessian矩阵的阈值
surf = cv2.xfeatures2d.SURF_create(400)
#设置是否要检测方向
surf.setUpright(True)
#输出设置值
print(surf.getUpright())
#找到关键点和描述符
kp, des = surf.detectAndCompute(img,None)
#把特征点标记到图片上
img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
#输出描述符的个数
print(surf.descriptorSize())
plt.imshow(img2),plt.show()