2015-09-29 84 views
3

我在一大組圖像中使用dHash(http://www.hackerfactor.com/blog/index.php?url=archives/529-Kind-of-Like-That.html)。 默認大小調整大小爲8個像素:圖像哈希指紋碰撞(dHash)

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嗎?

回答

0

您可以通過計算跨越相對於X值Y值的差別造成的二次DHash因爲你在這裏做什麼:

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

使用兩個DHashes可以減少衝突的可能性(但沒有消除它們)。

如果你想更進一步,你甚至可以添加PHash(更準確,但速度更慢的算法)混合。在這種情況下,如果您有任何碰撞,請創建兩個圖像的PHash以進行比較。

最後但並非最不重要的是,您可以使用比8x9更大的圖像計算散列。這將減少誤報,但它也會增加忽略圖像的機會。