我在一组非常大的图像中使用 dHash ( http://www.hackerfactor.com/blog/index.php?url=archives/529-Kind-of-Like-That.html )。
默认调整大小为 8 像素:
def dhash(image, hash_size=8):
"""
Difference Hash computation.
following http://www.hackerfactor.com/blog/index.php?/archives/529-Kind-of-Like-That.html
@image must be a PIL instance.
"""
image = image.convert("L").resize((hash_size + 1, hash_size), Image.ANTIALIAS)
pixels = numpy.array(image.getdata(), dtype=numpy.float).reshape((hash_size + 1, hash_size))
# compute differences
diff = pixels[1:, :] > pixels[:-1, :]
return ImageHash(diff)
如果我们应用这个算法来处理大量图像,我会不会因为哈希指纹较短而发生冲突?
什么是最好的 hash_size? hash_size 越大不是越准确吗?是 8 是因为某些特定原因吗?
最佳答案
您可以通过计算 Y 值与 X 值之间的差异来创建辅助 DHash,就像您在此处所做的那样:
pixels[1:, :] > pixels[:-1, :]
使用两个 DHash 可以减少冲突的可能性(但不能消除它们)。
如果您想更进一步,您甚至可以将 PHash(更准确但算法更慢)添加到组合中。在这种情况下,如果您有任何冲突,则创建两个图像的 PHash 来比较它们。
最后但并非最不重要的一点是,您可以使用比 8x9 更大的图像来计算哈希值。这将减少误报,但也会增加忽略图像的机会。
关于图像哈希指纹碰撞(dHash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835079/