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計算で発生しますが、私はそれについて少し知っています。