开发环境:win10 anaconda python3.6 opencv3
1、四种特征提取算法简介(需要深入的同学可以参考其他博主的博客)
SIFT
特征主要提取图像的局部特征,对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有很好的不变性,对视觉变化、仿射变换也保持一定程度的稳定性。SURF可以说是从SIFT发展而来的,速度上优于SIFT,快了一个数量级(10倍),并且稳定性要高于SIFT。而FAST算法提取了大量的特征点,但在计算时间上,比SIFT要快两个数量级 比SURF快一个数量级。ORB算法基于FAST算法,但是提取的特征点质量比FAST高,特征点数目比FAST较少。
实验数据在这篇博客:点击打开链接
计算速度: ORB>>SURF>>SIFT(各差一个量级)
旋转鲁棒性: SURF>ORB~SIFT(表示差不多)
模糊鲁棒性: SURF>ORB~SIFT
尺度变换鲁棒性: SURF>SIFT>ORB(ORB并不具备尺度变换性)
2、代码+效果对比
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import cv2
img = cv2.imread(r'C:\Users\Pictures\Camera Roll/test.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# one SIFT
#sift = cv2.xfeatures2d.SIFT_create()
#kp1 = sift.detect(gray,None)
#img1=cv2.drawKeypoints(gray,kp1,img)
#cv2.imshow("sift_Image", img1)
#cv2.imwrite(r'C:\Users\Pictures\Camera Roll/sift_test.jpg',img1)
#Compare four alogorithms
#Another SIFT
sift = cv2.xfeatures2d.SIFT_create()
(kps, descs) = sift.detectAndCompute(gray, None)
img1=cv2.drawKeypoints(gray, kps, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('SIFT_Algorithm', img1)
# SURF
surf = cv2.xfeatures2d.SURF_create()
(kps2, descs2) = surf.detectAndCompute(gray, None)
img2=cv2.drawKeypoints(gray, kps2, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('SURF_Algorithm', img2)
# FAST
fast = cv2.FastFeatureDetector_create()
kps3 = fast.detect(gray, None)
img3=cv2.drawKeypoints(gray, kps3, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('FAST_Algorithm', img3)
# ORB
orb = cv2.ORB_create()
kps4 = orb.detect(gray, None)
(kps4, des4) = orb.compute(gray, kps4)
img4=cv2.drawKeypoints(gray, kps4, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('ORB_Algorithm', img4)
最终的图像对比为:
![](https://i-blog.csdnimg.cn/blog_migrate/8fa8bb850d2e979855c1000e8ada4128.png)