图像哈希指纹碰撞(dHash)

标签 image hash fingerprint

我在一组非常大的图像中使用 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/

相关文章:

java - 使用 JAR 导出图像/文本文件

php - Bing Search、Imgur 和 Reddit 等网站如何根据 URL 生成网站缩略图?

arrays - 有没有更优雅的方法将这个数组转换为散列?

algorithm - 有了哈希和密码,我可以重新创建算法吗?

用于屏幕指纹的 Android API

node.js - 找不到名称 'require' - Angular 8

swift - 如何改变图像的大小?图像未填充

algorithm - 在数百万用户编辑的音频文件中查找重复内容(音频内容散列)

java - 使用指纹进行加密(与密码结合)

c++ - 将指纹(十六进制格式)转换为图像