Python 備忘録

Python-ver: 3.6.3

Pythonで類似度検出② ヒストグラム比較

はじめに

類似度検出の第一歩としてヒストグラム検出から見ていきたいと思います。
いずれはディープラーニングなんかも駆使して認識とか類似度検出ができるといいのですが。

今回、基礎に使う画像はこちら。適当に選んだ東京の夜景です。
f:id:sh0122:20171210170947j:plain

こちらと似た画像をヒストグラム比較で比べてみたいと思います。

ヒストグラム比較

まず、こちらの画像から比較してみます。
アメリカのサンフランシスコです。
f:id:sh0122:20171210171550j:plain

まずは、わかりやすいようにヒストグラムを見比べてみます。
ソースは以下の通り。

import cv2
import matplotlib.pyplot as plt

target_img_path = 'ファイルのパス'
img = cv2.imread(target_img_path)
plt.hist(img.ravel(),256,[0,256])
plt.show()

こちらが東京の夜景のヒストグラム
f:id:sh0122:20171210172706p:plain

こちらがサンフランシスコの夜景のヒストグラム
f:id:sh0122:20171210172911p:plain

いずれも左側が突き出た形になっているのがわかります。
こちらを比較してみます。

ソース

ヒストグラムを比較するだけなのでプログラムは大分雑です。

# -*- coding: UTF-8 -*-

import cv2
import matplotlib.pyplot as plt

def compare_by_hist():
	TARGET_FILE = 'tokyo.jpg'
	COMPARING_FILE = 'san-francisco.jpg'
	IMG_DIR = '../images/'
	IMG_SIZE = (200, 200)

	#比較するイメージファイルを読み込み、ヒストグラムを計算
	target_img_path = IMG_DIR + TARGET_FILE
	target_img = cv2.imread(target_img_path)
	target_img = cv2.resize(target_img, IMG_SIZE)
	target_hist = cv2.calcHist([target_img], [0], None, [256], [0, 256])

	#比較されるイメージファイルを読み込み、ヒストグラムを計算
	comparing_img_path = IMG_DIR + COMPARING_FILE
	comparing_img = cv2.imread(comparing_img_path)
	comparing_img = cv2.resize(comparing_img, IMG_SIZE)
	comparing_hist = cv2.calcHist([comparing_img], [0], None, [256], [0, 256])

	#ヒストグラムを比較する
	result = cv2.compareHist(target_hist, comparing_hist, 0)
	print(result)

if __name__ == '__main__':
	compare_by_hist()

結果

0.33651142534396467

この数字が類似度ということになります。まったく同じ画像だと1.0になります。
つまり、この画像の類似度は約33%ということになります。
思ったより低かったです。

他の画像と比較

東京の夜景と他の画像を比べてみました。
ダウンタウン
f:id:sh0122:20171210175209j:plain

0.6971260649928982

別の東京の写真
f:id:sh0122:20171210175459j:plain

0.6402893447411667

草原
f:id:sh0122:20171210175735j:plain

0.12629908970839823

雪原
f:id:sh0122:20171210180202j:plain

-0.43809553907956367

ダウンタウンや東京の夜景は60%の数値が出ましたが、まったく関係のない画像は低い数値が出ました。
ある程度は信用できるかと思いますが、まだまだ課題が多そうです。

まとめ

ヒストグラムを比較する手法では、色の割合を比較する。

人物を比較しなかったのは人物だと年齢や場所によって服や肌の色が変わってくるためです。
他の手法と併用して使えばある程度使えるのではないでしょうか。