OpenCV / SURF如何从描述符中生成图像哈希/指纹/签名?
image-processing
opencv
5
0

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

我要做的是获取一张图片的指纹,然后在数码相机拍摄的不同照片上找到同一张图片。 SURF算法是独立于缩放比例,角度和其他变形的最佳方法。

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

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

更新:

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

词汇树可以选择吗?

我将非常感谢您的帮助。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

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

关于此主题有几篇论文。入门文献为: 近似重复图像检测:min-Hash和tf-idf加权 Ondrej Chum,James Philbin,Andrew Zisserman,BMVC 2008 PDF

收藏
评论

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

void cvExtractSURF(const CvArr *图像,const CvArr *掩码,CvSeq **关键点,CvSeq **描述符,CvMemStorage *存储,CvSURFParams参数)

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

更新

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

收藏
评论

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

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

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

收藏
评论

似乎GIST可能是更适合使用的东西。

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号