Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

画像のヒストグラムを比較し類似度を求める

 カラー画像を読み出し、全画素のR(赤)の輝度を区間(X軸)、画素数を頻度(Y軸)としてプロットしたヒストグラムを作成します。似たような画像なら似たような傾向を示すかを調べます。opencvにはcalcHist関数があり、これにより画像のチャンネル(BGR)別のヒストグラムを計算できます。また、compareHist関数でヒストグラムの類似度を求めることができます。

関連記事

テンプレートマッチングで類似画像を探す
AKAZE特徴量による画像マッチング

やること
  • ファイル名を指定して画像ファイルを2つ読み出す
  • それぞれの画像の全画素のR(赤)の輝度をヒストグラム化する
  • ヒストグラムを比較し類似度を表示する
使った関数
  • cv2.imread : 画像ファイルの読み出し
  • cv2.calcHist : 配列のヒストグラム計算
  • matplotlib.pyplot.plot : グラフを作成
  • matplotlib.pyplot.show : グラフの表示
  • cv2.compareHist : ヒストグラムを比較し類似度を求める
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

f:id:T_A_T:20190307210221j:plain
mountain.jpg

f:id:T_A_T:20190307213436j:plain
ramen.jpg

コード
import cv2  #OpenCVのインポート
import matplotlib.pyplot as plt #matplotlib.pyplotのインポート

fname_1 = "mountain.jpg" #1つ目の画像ファイル名
fname_2 = "ramen.jpg" #2つ目の画像ファイル名

img_1 = cv2.imread(fname_1) #画つ目の像を読み出しオブジェクトimg_1に代入
img_2 = cv2.imread(fname_2) #画つ目の像を読み出しオブジェクトimg_2に代入

hist_g_1 = cv2.calcHist([img_1],[2],None,[256],[0,256]) #img_1のR(赤)のヒストグラムを計算
plt.plot(hist_g_1,color = "r") #ヒストグラムをプロット
plt.show() #プロットを表示

hist_g_2 = cv2.calcHist([img_2],[2],None,[256],[0,256]) #img_2のR(赤)のヒストグラムを計算
plt.plot(hist_g_2,color = "r") #ヒストグラムをプロット
plt.show() #プロットを表示

comp_hist = cv2.compareHist(hist_g_1, hist_g_2, cv2.HISTCMP_CORREL) #ヒストグラムの比較。比較methodにcv2.HISTCMP_CORRELを使用
print(comp_hist) #類似度を表示

実行結果

画像2つの赤画素の輝度を示すヒストグラムが表示され、ヒストグラムの類似度が表示されます。

f:id:T_A_T:20190307220356p:plain

f:id:T_A_T:20190307220414p:plain

-0.10546973170446176

別の画像でもやって見ます。

f:id:T_A_T:20190307210221j:plain
mountain.jpg

f:id:T_A_T:20190307220647j:plain
mountain_2.jpg

実行結果

こちらのほうが類似度が高いようです。

f:id:T_A_T:20190307220356p:plain

f:id:T_A_T:20190307220852p:plain

0.5111909545874317

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村