我正在使用ImageHash库来生成图像的感知散列。该库声称能够生成不同大小的散列(64、128、256),但我不知道如何获得 128 散列。
哈希大小由库重新缩放时的图像大小决定,例如:
def average_hash(image, hash_size=8):
image = image.convert("L").resize((hash_size, hash_size), Image.ANTIALIAS)
这里的默认值为 8(8x8 图像 = 64 像素 -> 灰度 -> 64 位)。
但是,如何创建 128 位哈希?
第二件事,pHash 的默认大小是 32,正如这里所解释的,但稍后将仅计算左上角 8x8 部分的 DCT,因此再次为 64 位。DCT 通过以下方式计算scipy.fftpack
:
def phash(image, hash_size=32):
image = image.convert("L").resize((hash_size, hash_size), Image.ANTIALIAS)
pixels = numpy.array(image.getdata(), dtype=numpy.float).reshape((hash_size, hash_size))
dct = scipy.fftpack.dct(pixels)
dctlowfreq = dct[:8, 1:9]
avg = dctlowfreq.mean()
diff = dctlowfreq > avg
return ImageHash(diff)
如何更改哈希大小?
无论使用哪个值,计算都将始终基于左上角的 8x8,因此始终为 64!
发生的奇怪事情是,如果我从 8 大小的 pHash 开始(从头调整图像大小),我得到了 56 位的最终哈希(即计算 7x8 图像的哈希:我不明白为什么这发生在DCT计算中——但我真的知道一点。