色合いが似ているものを探す。
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 |
もうひとつ。
彩度の低い部分を無彩色とみなしてヒストグラムに付け加えてみた。
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 |