我目前正在尝试使用Python中的openCV和SIFT来使用暴力特征匹配器。我希望将其用于我的服务器上的图像搜索功能,其中我输入一张图片并将该图片与其他图片进行比较,以期通过匹配结果指示相似度水平。是否有一种方法可以通过使用特征匹配来指示相似度水平?
目前,我正在尝试使用这个网站上找到的内容进行实验。
目前,我正在尝试使用这个网站上找到的内容进行实验。
img1 = cv2.imread('box.png',0) # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# Apply ratio test
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
plt.imshow(img3),plt.show()
目前我用来创建“相似度”指标的方法是应用比率测试获得的“好匹配”的数量,并通过简单的len(good)
找到存储在good中的“好匹配”的数量。
这返回了我用于评估输入图像与数据库中图像相似性的好匹配数。然而,我认为情况并不像这么简单,因为当我开始使用一张鞋子的图片进行测试时,例如香蕉的图片获得了比其他鞋子的图片更多的“好匹配”。甚至有时比不同颜色的同一款鞋子更相似。
我认为这可能只是一个异常情况,所以我继续使用更大的图像数据集进行测试,发现鞋子没有像四轮摩托车或人物图像那样获得高分(或好匹配数),而是与其他鞋子进行匹配。
因此,基本上,如何使用特征匹配定义两个图像之间的相似度并给出数字值?
谢谢。