我正在尝试为我的项目实施SIFT,并且我已经获得了关键点。我尝试将图像的每个关键点的欧氏距离与同一图像的所有关键点一起缩小。碰巧的是,查询图像的1个关键点与数据库图像中其余关键点的距离具有非常相似的值。如何选择最近的邻居以及如何确定这是正确的匹配。
欧几里德距离计算为,对于i = 1到128 sqrt [(pi-qi)^ 2],p = 1到数据库中关键点的数量。
非常感谢任何关于如何进行的想法
答案 0 :(得分:18)
我猜你正在尝试使用SIFT进行图像检索,因为你提到你有一个图像数据库,你要将查询图像与之比较。
您应该意识到,将查询图像中的每个SIFT描述符向量与图像数据库中的每个其他descritpor向量进行比较是不可行的,因为这将需要指数数量的比较。目前流行的使用SIFT描述符进行图像检索的方法是从文档检索中借用的词汇模型。
首先,您要做的是给出一个图像,使用SINGLE向量表示它,可以将其与数据库中其他图像的向量进行比较。这与您当前的方法不同,其中每个图像都有许多SIFT描述符向量(每个关键点一个)。在词袋(BOW)模型中,您首先需要创建所谓的可视化码本(或有时称为词典)。你这样做:
对于数据库中的每个图像,您将创建一个矢量
v
计算字典中不同特征出现的频率,因此每个图像将由以下形式的向量表示:<# times feature 1 in dictionary occur, ... feature 2 in dictionary occur..., ..., ... feature k in dictionary occur>
,即k维向量。您可以通过以下方式获取图像的矢量:
4.1。在图像中提取SIFT描述符
4.2。对于图像中的每个SIFT描述符,在代码簿/字典中找到最接近的聚类中心(使用欧几里德距离),并将向量v
中的相应计数增加1。
v
将为v = <2, 0, 0, 0, 1>
。由于v
计算代表向量在图像中出现的次数,v
有时也称为频率直方图。
在此阶段,您可能希望通过将每个条目除以所有条目的总和来对直方图进行标准化,以便可以使找到的具有非常不同数量的SIFT关键点的图像具有可比性。
现在,为了比较2个图像,您可以比较这个新的矢量v
而不是SIFT描述符本身。可以使用欧氏距离(也称为L2距离)进行比较。已经发现使用卡方距离或海林格距离可以改善结果。请参阅此page中描述的详细信息。
基本上将图像中的SIFT描述符本身与另一个图像中的SIFT描述符本身进行比较是不可行的,因为在图像中最终会有多个SIFT描述符,并且它们的数量会根据您提取它们的方式而有所不同。
你想要的是比较的共同基础,这是在BOW模型中通过将描述符与公共代码簿/字典相匹配来完成的,该代码簿/字典考虑了图像数据库中的代表性特征。