pHashアルゴリズムpython + opencv達成



Phash Algorithm Python Opencv Achieve



「知覚ハッシュアルゴリズム」(知覚ハッシュアルゴリズム)、その役割は、各画像に「指紋」(指紋)文字列を生成し、指紋の画像を比較することです。結果が近いほど、同様の画像が表示されます。

一般的な手順:



  • 画像を縮小します。32* 32は適切なサイズなので、DCTの計算が簡単です。
  • グレースケールに変換:画像は256レベルのグレースケールにスケーリングされます。 (平均的な特定のアルゴリズムのハッシュアルゴリズムの手順を参照してください)
  • DCTの計算:画像コレクションのDCT分離コンポーネント
  • 狭いDCT:DCT行列の計算が32 * 32になった後、8 * 8の左上隅を保持するために、これらの画像の最低頻度は
  • 平均値の計算:縮小されたDCTのすべてのピクセルの平均値を計算します。
  • さらに削減されたDCT:1より大きい平均値が記録され、0として記録され、その逆も同様です。
  • 得られた指紋情報:64情報ビットの組み合わせ、任意の順序で一貫性があります。
  • 最後に、指紋の2枚以上の写真をハミング距離で取得できます。

実装コード:

import cv2 import numpy as np from itertools import chain class PHash(object): @staticmethod def pHash(img_name): ''' get image pHash value ''' # Load and adjust the picture for 32x32 grayscale images img = cv2.imread(img_name, 0) img = cv2.resize(img, (64, 64), interpolation=cv2.INTER_CUBIC) # Create a two-dimensional list h, w = img.shape[:2] vis0 = np.zeros((h, w), np.float32) vis0 [: h,: w] = img # padding data # Transform two-dimensional Dct vis1 = cv2.dct(cv2.dct(vis0)) # Cv.SaveImage ( 'a.jpg', cv.fromarray (vis0)) # Save Image vis1.resize((32, 32), refcheck=False) # Two-dimensional list turned into a one-dimensional list img_list = list(chain.from_iterable(vis1)) # Calculate the mean avg = sum(img_list) * 1. / len(img_list) avg_list = ['0' if i