特征匹配中图像相似度的度量方法?

7
我目前正在尝试使用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中的“好匹配”的数量。

这返回了我用于评估输入图像与数据库中图像相似性的好匹配数。然而,我认为情况并不像这么简单,因为当我开始使用一张鞋子的图片进行测试时,例如香蕉的图片获得了比其他鞋子的图片更多的“好匹配”。甚至有时比不同颜色的同一款鞋子更相似。

我认为这可能只是一个异常情况,所以我继续使用更大的图像数据集进行测试,发现鞋子没有像四轮摩托车或人物图像那样获得高分(或好匹配数),而是与其他鞋子进行匹配。

因此,基本上,如何使用特征匹配定义两个图像之间的相似度并给出数字值?

谢谢。

1个回答

8
我认为你需要选择更好的特征以便获得更好(或更相似)的结果。SIFT是一种局部特征,即使在语义上不同的图像中(如鞋子和香蕉),也有很大可能找到类似的SIFT特征。
为了提高相似度准确性,我建议你除了使用SIFT外还要选择更好的特征,比如图像的颜色直方图。如果你使用图像的颜色直方图,你将会得到在颜色直方图上相似的图片。你可以使用好的组合特征来寻找相似度。你可以通过检查数据库中有哪些类型的图像以及你认为不同语义类别之间可能具有区别的特征来决定这个组合。
如果你愿意使用稍微不同的方法,我想建议PLSA,这是我用过的一种方法。概率潜在语义分析(PLSA)是一种无监督学习算法,它使用较低维度的隐藏类来表示数据。相似度可以通过计算新图像的低维表示与所有其他类之间的欧几里德距离来找到。你可以根据距离排序并获取相似的图像。即使在这里,选择正确的特征也很重要。此外,您还需要选择隐藏类的数量。您需要尝试不同数量的类别。
我有一个使用PLSA解决图像检索的小项目。如果你不介意的话,这是它的链接PLSA 图像检索。不幸的是它是Matlab格式的,但你可以理解其中发生了什么并尝试使用它。我使用颜色直方图作为特征。因此,请选择能帮助您更好地区分不同类别的特征。

嘿,感谢回应!实际上我已经使用直方图进行了一些测试,并尝试将直方图方法与特征匹配相结合,但是,该特征检测似乎并没有增强搜索结果,反而引入了更多错误的正例结果。我的最终计划是使用多种不同的搜索方法和算法,并创建一种组合方式以提供最佳匹配,但从我对特征检测的测试来看,它似乎产生了相反的效果。 - Questionnaire
我已尝试使用SIFT、SURF和ORB进行BF匹配和FLANN匹配,但结果仍然相对类似。 (我正在搜索的图像索引目前很小,仅在大约20到50个图像集中搜索。) - Questionnaire
很酷!问题是SIFT、SURF/ORB都是局部特征,即使它们捕捉到了像角点等有趣的特征,它们也不会捕捉到感兴趣对象的全局结构。这绝对不是一个简单的问题。我真的会押注于1)无监督聚类(如PLSA或仅使用SIFT的kmeans)。在这里使用HOG等全局特征很困难,因为样本量不大且对象类别不固定。第二个选择是2)使用SIFT和颜色直方图作为词袋模型。祝你一切顺利! - harshkn
我会尝试一下!非常感谢! - Questionnaire
@Questionnaire,你能告诉我哪种方法给你带来了最好的结果吗? - Ashika Umanga Umagiliya
我使用特征检测器(SIFT、ORB等)对两幅图像进行首次对齐,然后使用相关系数(Pearson、Spearman等)比较对齐的图像,效果不错。我在https://dsp.stackexchange.com/questions/52207/correlation-between-slightly-misaligned-images中讨论了这个问题。但是,这仅适用于两幅图像完全相同的情况,无法捕捉概念上的相似性(例如两张不同狗的图片)。我认为你应该尝试使用卷积神经网络来解决这个问题。 - Witiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接