サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

Python と OpenCV で 類似画像検索

全く同じ画像だけではなく、より幅広く'似てそう'な画像を探します。

OpenCVのインストール

OpenCVのインストールに関するページがネット上に多数あることから、OpenCVのインストールの難しさ(というより、やっかいさ?)が伺えますが、例に違わず僕もOpenCVのインストールに手間取ってしましました。

最終的には、
brewでインストールしたnumpy, opencv3をアンインストールした上で、
pip3 install opencv-python
opencvがpyhtonで使えるようになりました、のでご参考までに。



画像類似度計算

ヒストグラムの類似度により、画像の類似度を計算します。 ヒストグラムとは画像の明度の分布のことです。(ヒストグラム - CyberLibrarian)

OpenCVcalcHist()関数で画像のヒストグラムを計算できます。
またヒストグラムの比較はcompareHist()関数でできます。((’ω')便利ニナッタヨネー)

ヒストグラムの比較には4つの手法があり、それぞれ特徴があります。(参考ページ)(Histograms — OpenCV 2.4.13.7 documentation)(ヒストグラムの比較 - にのせき日記)


各手法に対し閾値(threshold)を設定してやり、類似度が閾値以上(手法によっては以下)の画像グループを抜き出して、表示するプログラムを作成しました。画像が入ったフォルダを指定すると、そのフォルダの画像の中で類似しているものを探します。

プログラムの__doc__に説明を書いてありますが、
METHODに0~3を入れて手法を選択、THRESHOLDに数字を入れて閾値を設定してやるとプログラムが動きます。(それぞれデフォルトを一応用意しました) <--- あくまで僕の経験則なので、自分でどんどんいじってください。

プログラム中の連結成分の計算のところは、例えば画像Aと画像Bが類似度が高く、かつ、画像Bと画像Cも類似度が高い時に、類似度が高い画像グループとしてA, B, Cを出力するためのデータ整理をしています。



実行結果

f:id:inarizuuuushi:20170121122548p:plain ネッコフォルダを作成します。

python3 image_compare.py ~/ネッコ/で上のスクリプトを実行すると
f:id:inarizuuuushi:20170121122708p:plain
4つの類似画像グループができました。それぞれ
f:id:inarizuuuushi:20170121122952p:plain f:id:inarizuuuushi:20170121123026p:plain f:id:inarizuuuushi:20170121123034p:plain f:id:inarizuuuushi:20170121123039p:plain

確かに類似度が高そうなグループになっているな〜という感じですね。
METHOD=0 python3 image_compare.py ~/ネッコ/で手法を変更したり、
MEDHOD=3 THRESHOLD=0.12 python3 image_compare.py ~/ネッコ/などと閾値を変更すると結果も変わってきます。
色々試してみてください。