SIFT特征提取

概述

SIFT算法由D.G.Lowe 1999年提出,2004年完善总结。
SIFT (Scale-invariant feature transform), 尺度不变特征转换,是一种图像局部特征提取算法,它通过在不同的尺度空间中寻找极值点(特征点,关键点)的精确定位和主方向,构建关键点描述符来提取特征。SIFT提取的关键点具有尺度不变性、旋转不变性,而且不会因光照、仿射变换和噪音等因素而干扰。
SIFT所查找到的关键点是一些十分突出、不会因光照、仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

算法原理及流程

建立高斯差分金字塔

在这里插入图片描述

极值点检测

在这里插入图片描述

确定关键点的主方向

在这里插入图片描述

构建关键点描述符

生成步骤:
1.将坐标轴旋转为特征点的方向,以确保旋转不变性;
2.对于一个关键点产生128维的SIFT特征向量;
3.将特征向量的长度归一化,去除光照变化的影响。
在这里插入图片描述

代码实现

关键点检测

img = cv2.imread('lena.jpg')
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(img,None)
img=cv2.drawKeypoints(img,kp,img,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('sift',img)
cv2.waitKey()

在这里插入图片描述

特征匹配

sift = cv2.xfeatures2d.SIFT_create()

# FLANN 参数设计
FLANN_INDEX_KDTREE = 0
#KTreeIndex配置索引,指定待处理核密度树的数量(理想的数量在1-16)
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
#指定递归遍历的次数
search_params = dict(checks=50)
#快速最近邻搜索包,一个对大数据集和高维特征进行最近邻搜索的算法的集合
flann = cv2.FlannBasedMatcher(index_params, search_params)

img1 = cv2.imread(imgname1)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)  # 灰度处理图像
kp1, des1 = sift.detectAndCompute(img1, None)  # des是描述子

img2 = cv2.imread(imgname2)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
kp2, des2 = sift.detectAndCompute(img2, None)


img3 = cv2.drawKeypoints(img1, kp1, img1, color=(255, 0, 255))
img4 = cv2.drawKeypoints(img2, kp2, img2, color=(255, 0, 255))

hmerge = np.hstack((img3, img4))
cv2.imshow("point", hmerge)
cv2.waitKey(0)
matches = flann.knnMatch(des1, des2, k=2)
matchesMask = [[0, 0] for i in range(len(matches))]

good = []
for m, n in matches:
    if m.distance < 0.5 * n.distance:
        good.append([m])

img5 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)
cv2.imshow("FLANN", img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

  • 4
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值