图像哈希指纹冲突(dHash)

时间:2015-09-29 03:10:59

标签: 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因为某些特定的原因吗?

2 个答案:

答案 0 :(得分:0)

您可以通过计算Y值的差异而不是X值来创建辅助DHash:

pixels[1:, :] > pixels[:-1, :]

使用两个DHashes可以减少碰撞的可能性(但不能消除它们)。

如果你想更进一步,你甚至可以添加PHash(更准确但速度更慢的算法)。在这种情况下,如果您有任何碰撞,则创建两个图像的PHash以进行比较。

最后但并非最不重要的是,您可以使用比8x9更大的图像来计算哈希值。这样可以减少误报,但也会增加忽略图像的几率。

答案 1 :(得分:0)

我最近查看了几百万dhash的统计数据。分布非常接近均匀性,即。 e。至少我的数据集没有任何模式,例如图像的上半部分趋于明亮等。

这意味着碰撞的可能性接近于二项式情况,并且每个位都独立。正确的IIRC,8x8像素表示您要保存的哈希为64位。有2 64 = 1.8 x 10 个可能的哈希,这很多。生日悖论再次将我们平方根击倒,因此您希望看到与第40亿张图像的第一次碰撞。