我正在使用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,正如here所解释的那样,但稍后将只计算左上角8x8部分的DCT值,因此同样是64位。离散余弦变换通过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计算中会发生这种情况-但我真的知道一点。
发布于 2019-06-25 12:24:49
这看起来像是库中的一个bug,后来被修复了。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而不是硬编码值。
https://stackoverflow.com/questions/30555098
复制相似问题