類似画像検索 - 知覚ハッシュ-DCT

離散コサイン変換(discrete cosine transform)の後、低周波域のみをハッシュ化する。

以下、コード。ハッシュ長は144。
画像データは前回と同様Caltech101から。BACKGROUND_Googleも同様に外してある。

import numpy as np
import cv2
import glob

def hdiff(a, b):
    return (a != b).astype('int').sum()   # astype()はなくても可、好みで
    
def mk_hash(img, size=48, hsize=12):
    img = cv2.resize(img, (size, size))
    img = cv2.dct(img.astype('float'))
    s = img[:hsize, :hsize]    
    m = np.median(s)
    return (s >= m)

q_img = cv2.imread("101_ObjectCategories/airplanes/image_0001.jpg", 0)
q_hash = mk_hash(q_img)

for file in sorted(glob.glob("101_ObjectCategories/*/*.jpg")):
    t_img = cv2.imread(file, 0)
    t_hash = mk_hash(t_img)
    d = hdiff(q_hash, t_hash)
    print(file, d)


クエリーも含めた上位10件。似ているものは一つもない、という判断で良いか。

画像 距離
airplanes/image_0001.jpg 0
airplanes/image_0693.jpg 46
airplanes/image_0147.jpg 48
airplanes/image_0396.jpg 48
airplanes/image_0758.jpg 48
gramophone/image_0030.jpg 48
headphone/image_0017.jpg 48
metronome/image_0031.jpg 48
Motorbikes/image_0135.jpg 50
Motorbikes/image_0211.jpg 50

左上がクエリー画像
https://kakasi.skr.jp/images/dct-hash.jpg