38

这里有一些主题对于如何找到相似的图片非常有帮助。

我想要做的是获取图片的指纹并在数码相机拍摄的不同照片上找到相同的图片。SURF 算法似乎是独立于缩放、角度和其他失真的最佳方式。

我正在使用带有 SURF 算法的 OpenCV 来提取样本图像上的特征。现在我想知道如何将所有这些特征数据(位置、拉普拉斯、大小、方向、粗麻布)转换为指纹或散列。

该指纹将存储在数据库中,并且搜索查询必须能够将该指纹与具有几乎相同特征的照片的指纹进行比较。

更新:

似乎没有办法将所有描述符向量转换为简单的哈希。那么将图像描述符存储到数据库中以进行快速查询的最佳方法是什么?

词汇树会是一种选择吗?

我将非常感谢任何帮助。

4

4 回答 4

9

您提到的特征数据(位置、拉普拉斯、大小、方向、粗麻布)不足以满足您的目的(如果您想进行匹配,这些实际上是描述符中不太相关的部分)。您要查看的数据是“描述符”(第 4 个参数):

void cvExtractSURF(const CvArr* image, const CvArr* mask, CvSeq** keypoints, CvSeq** 描述符, CvMemStorage* storage, CvSURFParams params)

这些是 128 或 64 个(取决于参数)向量,其中包含特定特征的“指纹”(每个图像将包含可变数量的此类向量)。如果您获得最新版本的 Opencv,他们有一个名为 find_obj.cpp 的示例,它向您展示了它是如何用于匹配的

更新

您可能会发现讨论很有帮助

于 2010-01-27T19:52:20.810 回答
3

计算哈希的一种简单方法如下。从图像中获取所有描述符(例如,其中 N 个)。每个描述符都是一个由 128 个数字组成的向量(您可以将它们转换为 0 到 255 之间的整数)。所以你有一组 N*128 整数。只需将它们一个接一个地写入一个字符串并将其用作哈希值。如果您希望哈希值很小,我相信有一些方法可以计算字符串的哈希函数,因此将描述符转换为字符串,然后使用该字符串的哈希值。

如果您想找到确切的重复项,这可能会起作用。但似乎(因为您谈论缩放、旋转等)您只想找到“相似”的图像。在这种情况下,使用哈希可能不是一个好方法。您可能会使用一些兴趣点检测器来查找计算 SURF 描述符的点。想象一下,它将返回相同的点集,但顺序不同。突然之间,即使图像和描述符相同,您的哈希值也会非常不同。

所以,如果我必须可靠地找到相似的图像,我会使用不同的方法。例如,我可以对 SURF 描述符进行矢量量化,构建矢量量化值的直方图,并使用直方图交集进行匹配。您真的必须使用哈希函数(也许是为了提高效率),还是只想使用任何东西来查找相似的图像?

于 2010-01-30T01:22:19.977 回答
2

似乎 GIST 可能更适合使用。

http://people.csail.mit.edu/torralba/code/spatialenvelope/有 MATLAB 代码。

于 2010-02-08T20:24:36.467 回答
2

Min-Hashmin-Hashing是一种可能对您有所帮助的技术。它将整个图像编码为可调整大小的表示,然后存储在哈希表中。确实存在几种变体,例如Geometric min-HashingPartition min-HashBundle min-Hashing 。产生的内存占用不是最小的之一,但这些技术适用于各种场景,例如近重复检索甚至小对象检索——其他短签名通常表现不佳的场景。

关于这个主题有几篇论文。条目文献将是: 近重复图像检测:min-Hash 和 tf-idf 加权 Ondrej Chum,James Philbin,Andrew Zisserman,BMVC 2008 PDF

于 2013-06-10T21:22:30.543 回答