自选一张图片,利用sift和ORB,FAST以及其他特征提取方法(至少三种,越多越好),分别提取特征点。并对各种方法的原理做简要概述,对结果进行分析。
FAST提取大量的特征点,在计算时间上,比SIFT快,ORB在FAST基础上得来的,特征点的质量更高。
SIFT算子是把图像中检测到的特征点用一个128维的特征向量进行描述,因此一幅图像经过SIFT算法后表示为一个128维的特征向量集,该特征向量集具有对图像缩放,平移,旋转不变的特征,对于光照、仿射和投影变换也有一定的不变性
import cv2 as cv
img = cv.imread('image/letter.png')
sift_img = img.copy()
gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)
sift_img=cv.drawKeypoints(gray,kp,sift_img)
cv.imshow("raw", img)
cv.imshow("sift", sift_img)
cv.waitKey()
ORB采用FAST算法来检测特征点。FAST核心思想就是找出那些卓尔不群的点,即拿一个点跟它周围的点比较,如果它和其中大部分的点都不一样就可以认为它是一个特征点。
import cv2
img = cv2.imread('image/letter.png')
\# 实例化
orb = cv2.ORB_create()
\# 查询特征点
kp = orb.detect(img, None)
\# 使用计算描述符
kp, des = orb.compute(img, kp)
\# 画关键点的位置
img2 = cv2.drawKeypoints(img, kp, None, color=(0, 255, 0), flags=0)
cv2.imshow("raw",img)
cv2.imshow("orb",img2)
cv2.waitKey()
Fast特征点检测feature2D原理是在圆周上按顺时针方向从1到16的顺序对圆周像素点进行编号。如果在圆周上有N个连续的像素的亮度都比圆心像素的亮度Ip加上阈值t还要亮,或者比圆心像素的亮度减去阈值还要暗,则圆心像素被称为角点。
import cv2 as cv
img = cv.imread('image/letter.png',0)
\# 实例化
fast = cv.FastFeatureDetector_create()
\# 找出并画出特征点
kp = fast.detect(img,None)
img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
\# 禁用 nonmaxSuppression
fast.setNonmaxSuppression(0)
kp = fast.detect(img,None)
img3 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
cv.imshow('raw',img)
cv.imshow('true',img2)
cv.imshow('false',img3)
cv.waitKey()