在ImageHash Python库中更改散列大小

时间:2015-05-31 07:52:16

标签: python hash scipy dct phash

我正在使用ImageHash库来生成图像的感知哈希。该库声称能够生成不同大小的哈希值(64,128,256),但我无法计算如何获得128哈希。

散列大小由库重新缩放时的图像大小决定,例如:

Map

这里默认值是8(8x8图像= 64像素 - >灰度 - > 64位)。

但是,如何创建128位哈希?

第二件事,pHash的默认大小为32,如here所述,但稍后将仅计算左上角8x8部分的DCT,因此再次计算64位。 DCT通过def average_hash(image, hash_size=8): image = image.convert("L").resize((hash_size, hash_size), Image.ANTIALIAS) 计算:

scipy.fftpack

如何更改散列大小?
无论使用哪个值,计算将始终基于左上角8x8,因此将始终为64!

奇怪的是,如果我从一个8尺寸的pHash开始(从头开始调整图像大小),我得到了56位的最终散列(即,计算7x8图像的散列:我不喜欢理解为什么会在DCT计算中发生这种情况 - 但我真的对此有所了解。

1 个答案:

答案 0 :(得分:0)

这似乎是库中的错误,此错误已得到修复。 phash的当前实现如下所示:

def phash(image, hash_size=8, highfreq_factor=4):
    """
    Perceptual Hash computation.
    Implementation follows http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
    @image must be a PIL instance.
    """
    if hash_size < 2:
        raise ValueError("Hash size must be greater than or equal to 2")

    import scipy.fftpack
    img_size = hash_size * highfreq_factor
    image = image.convert("L").resize((img_size, img_size), Image.ANTIALIAS)
    pixels = numpy.asarray(image)
    dct = scipy.fftpack.dct(scipy.fftpack.dct(pixels, axis=0), axis=1)
    dctlowfreq = dct[:hash_size, :hash_size]
    med = numpy.median(dctlowfreq)
    diff = dctlowfreq > med
    return ImageHash(diff)

您会注意到它正确使用了hash_size而不是硬编码值。