图像哈希指纹冲突(dHash)
Image hash fingerprint collision (dHash)
我在一组非常大的图像中使用 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, :]
使用两个 DHashes 可以减少冲突的可能性(但不能消除冲突)。
如果您想更进一步,您甚至可以将 PHash(更准确但算法更慢)添加到组合中。在这种情况下,如果您有任何碰撞,则创建两个图像的 PHash 以比较它们。
最后但并非最不重要的一点是,您可以使用大于 8x9 的图像计算哈希值。这将减少误报,但也会增加忽略图像的机会。
最近看了几百万dhashes的统计。分布非常接近均匀,i。 e.至少我的数据集没有任何规律,比如图像的上半部分更亮等等
这意味着冲突的概率接近于每个位独立的二项式情况。 IIRC 正确,8x8 像素意味着您保存的哈希是 64 位。有 264 = 1.8 x 1019 种可能的哈希值,数量很多。生日悖论再次将我们击倒平方根,所以你会期待看到你与你的第 40 亿张图像的第一次碰撞。
我在一组非常大的图像中使用 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, :]
使用两个 DHashes 可以减少冲突的可能性(但不能消除冲突)。
如果您想更进一步,您甚至可以将 PHash(更准确但算法更慢)添加到组合中。在这种情况下,如果您有任何碰撞,则创建两个图像的 PHash 以比较它们。
最后但并非最不重要的一点是,您可以使用大于 8x9 的图像计算哈希值。这将减少误报,但也会增加忽略图像的机会。
最近看了几百万dhashes的统计。分布非常接近均匀,i。 e.至少我的数据集没有任何规律,比如图像的上半部分更亮等等
这意味着冲突的概率接近于每个位独立的二项式情况。 IIRC 正确,8x8 像素意味着您保存的哈希是 64 位。有 264 = 1.8 x 1019 种可能的哈希值,数量很多。生日悖论再次将我们击倒平方根,所以你会期待看到你与你的第 40 亿张图像的第一次碰撞。