Local Feature Matching(python实现)

本文介绍了SIFT(尺度不变特征变换)算法,它用于检测图像的局部特征,具有旋转、尺度缩放、亮度变化不变性。SIFT算法具有独特性、信息量丰富、多量性和高速性等特点。通过Python的OpenCV库实现SIFT特征点检测及匹配,展示了从图像处理到特征点绘制和匹配的完整过程,包括图像的灰度处理、特征点检测、匹配和显示效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、题目

二、原理

三、效果

四、代码


一、题目

二、原理

SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果。

SIFT算法的特点有:

(1) SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

(2) 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

(3) 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

(4) 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

(5)可扩展性,可以很方便的与其他形式的特征向量进行联合。

三、效果

原图:

      

效果:

(1)img_a.jpg同img_b.jpg进行灰度处理并合并,形成img1.jpg

(2)画出img_a.jpg和img_b.jpg的特征点并用红圈标出,并合并,形成img2.jpg

(3)在cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)下的匹配效果,形成img3.jpg

四、代码

import numpy as np
import cv2
from matplotlib import pyplot as plt

imgname1 = 'img_a.jpg'
imgname2 = 'img_b.jpg'

sift = cv2.xfeatures2d.SIFT_create()

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)  #des是描述子

hmerge = np.hstack((gray1, gray2)) #水平拼接
cv2.imshow("gray", hmerge) #拼接显示为gray
cv2.imwrite('img1.jpg', hmerge)
cv2.waitKey(0)

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) #拼接显示为gray
cv2.imwrite('img2.jpg', hmerge)
cv2.waitKey(0)

# BFMatcher解决匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

# 调整ratio
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])

img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
cv2.imshow("BFmatch", img5)
cv2.imwrite('img3.jpg', img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值