import cv2
from skimage import transform as transform
from skimage.feature import (match_descriptors, ORB, plot_matches)
img1=cv2.imread('C:/Users/xpp/Desktop/Lena.png',0)#原始图像
img2=cv2.imread('C:/Users/xpp/Desktop/face.png',0)#原始图像
sift=cv2.xfeatures2d.SIFT_create()#实例化
kp1,des1=sift.detectAndCompute(img1,None)#找出图像中的关键点
kp2,des2=sift.detectAndCompute(img2,None)#找出图像中的关键点
bf=cv2.BFMatcher()#创建BF暴力匹配对象
matches=bf.knnMatch(des1,des2,k=2)#获得两幅图像的k个最佳匹配
good_matches=[]
for m1, m2 in matches:
if m1.distance<0.75*m2.distance:
good_matches.append([m1])#比值小于0.75,即最佳匹配点
img3=cv2.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=2)#在最佳匹配点之间绘制直线
pylab.imshow(img3)
pylab.show()
算法:SIFT暴力匹配是通过识别两个图像之间的SIFT关键点最近的邻居来进行匹配。但在某些情况下,由于噪声等因素,第二个最接近的匹配似乎更接近第一个匹配。在这种情况下,计算最近距离与第二最近距离的比率,并检验它是否大于0.8。如果比率大于0.8,则表示拒绝。这有效地消除了约90%的错误匹配,且只有约5%的正确匹配。
网址:https://www.cs.ubc.ca/~lowe/pubs.html
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!