使用pHash搜索庞大的图像数据库,最好的方法是什么?

时间:2013-08-15 16:56:47

标签: java image-processing duplicate-removal cbir phash

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

现在我必须比较一个新图像,我必须使用针对现有记录的pHash为此创建哈希。但根据我的理解,比较并不像

那样直截了当
hash1 - has2 < threshold

看起来我需要将两个哈希码传递到pHash API来进行匹配。所以我必须批量检索DB中的所有哈希码,并使用pHash API逐个进行比较。

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

我需要了解以下内容。

  1. 我对使用pHash与现有图像db进行比较的理解/方法是否正确?
  2. 有没有更好的方法来处理这个问题(不使用像lire这样的cbir库)?
  3. 我听说有一个名为dHash的算法,它也可以用于与哈希码的图像比较..这里有任何java库,可以和pHash一起使用来优化大图像和重复图像的任务处理任务。
  4. 提前致谢。

2 个答案:

答案 0 :(得分:3)

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

  

您需要使用mvptree存储机制

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

答案 1 :(得分:2)

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

我正在使用类似的项目,并实施了BK tree in cython。它具有相当的性能(对于1200万个项目数据集,搜索汉明距离为2小于50毫秒,并且接触约0.01-0.02%的树节点)。

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

这是64位散列大小。