我正在使用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计算中发生这种情况 - 但我真的对此有所了解。
答案 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
而不是硬编码值。