在固定长度的十六进制列表中找到最小汉明距离的最快方法

时间:2016-09-20 03:04:36

标签: python hamming-distance

我在Python中使用Imagehash来生成大约30,000张图像的48位十六进制哈希值,我将其存储在词典列表中(相位以及其他一些图像属性) )。例如:

[{"name":"name1", "phash":"a12a5e81127d890a7c91897edc752b506657233f56c594b7e6575e24e457d465"},
 {"name":"name2", "phash":"a1aa7e011367812a7c9181be9975a9e86657239f3ec09697e6565a24e50bf477"}
 ...
 {"name":"name30000", "phash":"a1aa7e05136f810afc9181ba9951a9686617239f3ec4d497e6765a04e52bfc77"}]

然后我从Raspberry Pi中获取了视频输入,这是一个被淘汰的,并且该哈希与这个数据库进行比较(考虑到Pi相机的性质,来自视频流的测试哈希将永远不会匹配数据库中的哈希) 。现在我正在进行一个愚蠢的循环,这需要大约5秒的时间来循环并检查每个~30,000个预先计算的哈希值的汉明距离,这太慢了。我使用的Imagehash库意味着可以通过dbHash1 - testHash简单地计算汉明距离。显然排序和执行bisect不是解决这个问题的方法,因为排序与汉明距离无关。那么,我认为必须有一种更快的方法来完成这项工作?我已经阅读了有关度量标准空间的this question,但我想检查一下(相对)简单的Python实现是否有人知道。

2 个答案:

答案 0 :(得分:0)

我得到了ImageHash背后的人的回答,Johannes Buchner

我可以将DB存储为2d矩阵:

arr = []
for dbHash in db:
    arr.append(dbHash.hash.flatten())
arr = numpy.array(arr)

然后我可以同时对所有人进行比较:

binarydiff = arr != testhash.hash.reshape((1,-1))
hammingdiff = binarydiff.sum(axis=1)
closestdbHash_i = numpy.argmin(hammingdiff)
closestdbHash = db[closestdbHash_i]

答案 1 :(得分:-1)

Scipy's pairwise distance function 支持汉明距离。我试试。