離散コサイン変換(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 |