画像のヒストグラムを比較し類似度を求める
カラー画像を読み出し、全画素のR(赤)の輝度を区間(X軸)、画素数を頻度(Y軸)としてプロットしたヒストグラムを作成します。似たような画像なら似たような傾向を示すかを調べます。opencvにはcalcHist関数があり、これにより画像のチャンネル(BGR)別のヒストグラムを計算できます。また、compareHist関数でヒストグラムの類似度を求めることができます。
関連記事
テンプレートマッチングで類似画像を探す
AKAZE特徴量による画像マッチング
やること
使った関数
- cv2.imread : 画像ファイルの読み出し
- cv2.calcHist : 配列のヒストグラム計算
- matplotlib.pyplot.plot : グラフを作成
- matplotlib.pyplot.show : グラフの表示
- cv2.compareHist : ヒストグラムを比較し類似度を求める
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
コード
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つの赤画素の輝度を示すヒストグラムが表示され、ヒストグラムの類似度が表示されます。
-0.10546973170446176
別の画像でもやって見ます。
実行結果
こちらのほうが類似度が高いようです。
0.5111909545874317