類似画像検索 - 色相ヒストグラム

色合いが似ているものを探す。
BGRをHSVに変換してHチャンネルのヒストグラムを比較。OpenCVヒストグラム比較関数compareHistには比較方法がいくつかあるが、ここではHISTCMP_CORRELを使った。

画像データは前回と同様。

import numpy as np
import cv2
import glob

def hue_hist(img, bins=180):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    hist = cv2.calcHist([hsv], [0], None, [bins], [0, 180])
    hist = cv2.normalize(hist, None, 0.0, 1.0, cv2.NORM_MINMAX)

    return hist

# cv2.HISTCMP_CORREL cv2.HISTCMP_CHISQR cv2.HISTCMP_INTERSECT
# cv2.HISTCMP_BHATTACHARYYA
METHOD = cv2.HISTCMP_CORREL

q_img = cv2.imread("101_ObjectCategories/airplanes/image_0001.jpg")
q_hist = hue_hist(q_img)

for file in sorted(glob.glob("101_ObjectCategories/*/*.jpg")):    
    t_img = cv2.imread(file)
    t_hist = hue_hist(t_img)
    res = cv2.compareHist(q_hist, t_hist, METHOD)
    print(file, "%f" %res)

上位10件。

画像 距離(相関)
airplanes/image_0001.jpg 1.000000
airplanes/image_0098.jpg 0.810632
airplanes/image_0654.jpg 0.754177
airplanes/image_0096.jpg 0.748533
airplanes/image_0043.jpg 0.741743
airplanes/image_0108.jpg 0.737610
airplanes/image_0112.jpg 0.734328
airplanes/image_0097.jpg 0.729563
cougar_face/image_0026.jpg 0.729044
trilobite/image_0045.jpg 0.722908

左上がクエリー。
https://kakasi.skr.jp/images/hue-hist1.jpg

もうひとつ。
彩度の低い部分を無彩色とみなしてヒストグラムに付け加えてみた。

def hue_hist(img, bins=180):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    hist = cv2.calcHist([hsv], [0], None, [bins], [0, 180])
    sat = (hsv[1][hsv[1] < 16]).sum()
    hist = np.append(hist, np.float32(sat))
    hist = cv2.normalize(hist, None, 0.0, 1.0, cv2.NORM_MINMAX)

    return hist
画像 距離(相関)
airplanes/image_0001.jpg 1.000000
airplanes/image_0098.jpg 0.802612
airplanes/image_0112.jpg 0.738731
airplanes/image_0654.jpg 0.738362
airplanes/image_0097.jpg 0.738173
airplanes/image_0096.jpg 0.731359
airplanes/image_0043.jpg 0.725022
airplanes/image_0108.jpg 0.721613
airplanes/image_0616.jpg 0.720733
airplanes/image_0008.jpg 0.714926

https://kakasi.skr.jp/images/hue-hist2.jpg