使用 pHash 搜索一个巨大的图像数据库,最好的方法是啥?

Posted

技术标签:

【中文标题】使用 pHash 搜索一个巨大的图像数据库,最好的方法是啥?【英文标题】:Using pHash to search agaist a huge image database, what is the best approach?使用 pHash 搜索一个巨大的图像数据库,最好的方法是什么? 【发布时间】:2013-08-17 22:26:17 【问题描述】:

假设这些图像记录具有使用 pHash 生成的哈希码,我需要搜索一个巨大的图像数据库以使用 pHash 查找可能的重复项。

现在我必须比较一个新图像,并且我必须使用 pHash 与现有记录创建散列。但据我了解,has 比较并不像

hash1 - has2 < threshold

看起来我需要将两个哈希码都传递到 pHash API 中进行匹配。所以我必须从数据库中批量检索所有哈希码并使用 pHash API 进行一一比较。

但是,如果队列中有大约 1000 张图像要与数百万已存在的图像进行比较,这看起来不是最好的方法。

我需要知道以下内容。

    我对使用 pHash 与现有图像数据库进行比较的理解/方法是否正确? 是否有更好的方法来处理这个问题(不使用像 lire 这样的 cbir 库)? 听说有一种算法叫dHash,它也可以用来和哈希码进行图像比较。有没有java库可以和pHash一起使用来优化这个大图像和重复图像的任务处理任务。

提前致谢。

【问题讨论】:

【参考方案1】:

我认为这个问题的某些部分在 pHash 支持论坛上进行了讨论。

您将需要使用 mvptree 存储机制

http://lists.phash.org/htdig.cgi/phash-support-phash.org/2011-May/000122.html 和 http://lists.phash.org/htdig.cgi/phash-support-phash.org/2010-October/000103.html

【讨论】:

【参考方案2】:

根据您对“巨大”的定义,一个好的解决方案是实现 BK-Tree 哈希树 (human readable description)。

我正在处理一个类似的项目,我实现了一个BK tree in cython。它的性能相当好(对于 1200 万个项目数据集,汉明距离为 2 的搜索时间不到 50 毫秒,并且触及约 0.01-0.02% 的树节点)。

更大规模的搜索(编辑距离为 8)需要更长的时间(约 500 毫秒)并触及大约 5% 的树节点。

这是一个 64 位散列大小。

【讨论】:

以上是关于使用 pHash 搜索一个巨大的图像数据库,最好的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

就是看起来像而已——图像搜索内核探索

看起来像它——图像搜索其实也不难

感知哈希算法

使用 .NET 中的 pHash

在另一个图像中搜索图像的算法。 (大学)

python 将phash得到的64位数据转换成BIGINT方便存储到数据库