目录
一、SIFT算法
1.描述:
Harris和Shi-Tomasi角点检测具有旋转不变性,但是都不具有尺度不变性,当图象被放大后,使用同样的窗口,就会检测不到角点,此时需要尺度不变特征转换即SIFT算法,分为以下四步:
1>尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点,一个图像的尺度空间L(x,y,),定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,)卷积运算
2>关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度,关键点的选择依据于它们的稳定程度。
3>关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向, 所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。
4>关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度,这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。
2.实现:
1>实例化sift
sift=cv.xfeatures2d.SIFT_create()
2>利用sift.detectAndCompute()检测关键点并计算
kp,des=sift.detectAndCompute(gray,None)
参数:
kp:关键点信息,包括位置、尺度、方向信息
des:关键点描述符,每个关键点对应128个梯度信息的特征向量
3>将关键点检测结果绘制在图像上
cv.drawKeypoints(image,keypoints,outputimage,color,flags)
参数;
keypoints:关键点信息
outputimage:输出图片,可以是原始图像
color:通过修改(B,G,R)的值
flags:绘图功能的标识设置
flags相关参数 | 描述 |
cv.DRAW_MATCHES_FLAGS_DEFAULT | 创建输出图像,使用现存输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点 |
cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG | 不创建输出图像矩阵,在输出图像上绘制匹配对 |
cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS | 对每一个特征点绘制带大小和方向的关键点图形 |
cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS | 单点的特征点不被绘制 |
3.示例:
-
import numpy
as np
-
import matplotlib.pyplot
as plt
-
import cv2
as cv
-
img=cv.imread(
'building.jpg')
-
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
-
sift=cv.xfeatures2d.SIFT_create()
-
kp,des=sift.detectAndCompute(gray,
None)
-
cv.drawKeypoints(img,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
-
plt.imshow(img[:,:,::-
1])
-
plt.show()
二、FAST算法
1.描述:
FAST算法是一种用于角点检测的算法,该算法原理是提取图像中检测点,以该点为圆心的周围邻域内像素点判断检测点是否为角点,即若有一个像素周围有一定数量的像素与该点像素值不同,则认为其是角点,流程如下:
1.在图像中选取一个像素点p,来判断它是不是关键点,Ip等于像素点p的灰度值。
2.以r为半径画圆,覆盖p点周围的M个像素,通常情况下,设置r=3,则M=16,如下图所示:
3.设置一个阈值t,如果在这16个像素点中存在n个连续像素点的灰度值都高于Ip + t,或者低于Ip-t,那么像素点p就被认为是一个角点。如上图中的虚线所示,n一般取值为12。
4.由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,此时会浪费许多时间,因此采用进行非特征点判别的方法:首先对候选点的周围每个90度的点: 1, 9, 5, 13 进行测试(先测试1和19,如果它们符合阈值要求再测试5和13)如果p是角点,那么这四个占中至少有3个要符合阈值要求,否则剔除,再对剩下进行检测
2.实现:
1>实例化fast:
fast=cv.FastFeatureDetector_create(threshold,nonmaxSuppression)
threshold:阈值,默认10
nonmaxSuppression:进行非极大值抑制,默认True
2>利用fast.detect()检测关键点
kp=fast.detect(gray,None) #没有关键点描述
3>将关键点绘制在图像上
cv.drawKeypoints(image,keypoints,outputimage,color,flags)
3.示例:
-
import numpy
as np
-
import matplotlib.pyplot
as plt
-
import cv2
as cv
-
img=cv.imread(
'building.jpg')
-
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
-
fast=cv.FastFeatureDetector_create(threshold=
30)
-
kp=fast.detect(img,
None)
-
img2=cv.drawKeypoints(img,kp,
None,color=(
0,
0,
255))
-
plt.imshow(img2[:,:,::-
1])
-
plt.show()
三、ORB算法
1.描述:
ORB算法提出构造金字塔,为fast特征点添加了方向,使关键点具有尺度不变性和旋转不变性,改进了 Brief算法,Brief描述子不具备旋转不变性,理想的特征点描述子应该具备旋转不变性,使得图像在经过一定的旋转后仍然能够识别匹配其中的特征点,ORB算法解决了旋转一致性问题
2.实现:
1>实例化orb:
orb=cv.ORB_create(nfeatures)
nfearures:特征点最大数量
2>利用orb.detectAndCompute()进行关键点检测
kp,des=orb.detectAndCompute(gray,None)
3>将关键点检测结果绘制在图像上
cv.drawKeypoints(image,keypoints,outputimage,color,flags)
3.示例:
-
import numpy
as np
-
import matplotlib.pyplot
as plt
-
import cv2
as cv
-
img=cv.imread(
'building.jpg')
-
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
-
orb=cv.ORB_create(nfeatures=
4000)
-
kp,des=orb.detectAndCompute(img,
None)
-
img2=cv.drawKeypoints(img,kp,
None,color=(
0,
255,
0))
-
plt.imshow(img2[:,:,::-
1])
-
plt.show()
转载:https://blog.csdn.net/m0_70964767/article/details/127480034