5

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

4

1 に答える 1