2

我目前正在尝试使用python在openCV中使用SIFT的Brute Force功能匹配器。我试图将它用于我的服务器上的图像搜索功能,我在其中输入图像并将该图像与其他图像进行比较,希望这些匹配能够指示相似程度。有没有通过使用特征匹配来表示相似程度的方法?特征匹配的图像相似度测量?

目前,我在玩弄我的 this网站,这也是我将在下面发现后:

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)即可找到有多少“好”匹配存储在良好中。

这返回了我用来评估输入图像与数据库相似度的匹配数目。不过,我认为它并不像这样简单,因为当我开始使用鞋子的图片测试这种图像时,像香蕉之类的图像比其他图像的鞋子获得更多的“好”匹配。甚至可以比其他颜色的鞋更相似。

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

所以基本上,我怎样才能定义两个图像使用特征匹配与数值相似度?

谢谢。

回答

4

我认为你需要选择更好的功能,以获得更好的(或更相似的图像)结果。 SIFT是一种本地功能,即使图像的语义不同(如鞋子和香蕉),您也可以找到类似的SIFT功能。

为了提高相似性的准确性,我建议你决定除了SIFT以外的更好的功能。像图像中的颜色直方图一样。如果使用图像的颜色直方图,则会得到颜色直方图中相似的图像。为了找到相似性,您可以使用多种功能组合。您可以通过检查数据库中的图像类型以及您感觉可能是不同语义类之间的明显特征来决定这种混合。

如果你可以使用稍微不同的方法,我想建议PLSA,这是我用过的方法。概率潜在语义分析(PLSA)是一种无监督学习算法,它表示低维隐藏类的数据。通过计算新图像低维表示与所有其他类别的欧式距离,可以找到相似性。您可以根据距离对其进行排序并获得相似的图像。即使这里选择正确的功能也很重要。你也需要选择隐藏类的数量。你需要尝试一些类。

我有一个使用PLSA解决图像检索的小型项目。所以如果你不介意这个插件,这里是PLSA Image retrieval。不幸的是它是Matlab,但你可以理解发生了什么,并尝试使用它。我使用颜色直方图作为功能。所以选择能帮助你更好地辨别不同类别的功能。

+0

嘿,谢谢你的回应!实际上,我已经使用直方图进行了一些测试,甚至尝试将直方图方法与特征匹配相结合,但是,而不是补充搜索结果,特征检测似乎会导致更多的误报进入查询结果。我希望得到相反的效果,因为我的最终计划是使用多种不同的方法和算法进行搜索并创建各种组合以提供最佳匹配,但是从我用特征检测测试的结果来看,似乎有相反的效果。 – Questionnaire

+0

P.S.我试过用BF匹配和FLANN匹配来使用SIFT,SURF和ORB,但是,我仍然收到了相似的结果。 (我正在搜索的图片索引目前很少,只能搜索大约20到50张图片。 – Questionnaire

+0

酷!事情是SIFT,SURF/ORB都是本地功能,即使它们捕获角点等有趣功能他们不会捕获一个感兴趣对象的全局结构,这绝对不是一个简单的问题,我真的会打赌:1)无监督聚类(像PLSA或甚至是SIFT的kmeans)。这里使用像HOG这样的全局特征是很困难的,因为样本量不大,而且对象类不固定。第二个赌注将是2)使用SIFT和颜色直方图作为包字模型。祝你一切顺利! – harshkn