画像処理ライブラリOpenCVのcalcHistにより画像の画素値分布を示すヒストグラムを計算できる。またcompareHistにより2つの画像ヒストグラムを比較できる。
OpenCVを使うには次のようにインポートが必要。
import cv2
1. calcHistによるヒストグラム算出
calcHist の書式は以下の通り。
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]] )
引数 | 意味 |
---|---|
images | ヒストグラムを計算する画像 |
channels | ヒストグラムを計算するチャンネルのインデックス指定。グレースケール画像の場合は[0]、カラー画像の場合は[0],[1],[2](B,G,R)のいずれかを指定 |
mask | 特定の領域のみヒストグラムを算出する場合のマスク画像の指定。指定しない場合はnoneとする |
histSize | ヒストグラムのビン(階級)の数。全画素値を指定する場合は[256]とする |
ranges | ヒストグラムを算出する画素値の範囲。通常は[0,256]を指定 |
以下の画像'miyako.jpg'(フリー写真素材ぱくたそより)についてヒストグラムを計算する。画像サイズは幅600高さ400ピクセル。
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('miyako.jpg') color = ('b','g','r') for i, col in enumerate(color): histr = cv2.calcHist([img], [i], None, [256], [0,256]) plt.plot(histr,color = col) plt.xlim([0,256]) plt.show()
実行結果
2. マスク画像による特定個所のヒストグラム算出
画像の特定領域のヒストグラムを算出する場合は、ヒストグラムを計算したい領域を白、計算から除きたい領域を黒にしたマスク画像を用意しcalcHistに与える。マスク画像のサイズは計算する画像と同じにする。
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('miyako.jpg') mask = np.zeros(img.shape[:2], np.uint8) mask[250:350, 50:550] = 255 cv2.imwrite('mask.jpg', mask) color = ('b','g','r') for i, col in enumerate(color): histr = cv2.calcHist([img], [i], mask, [256], [0,256]) plt.plot(histr,color = col) plt.xlim([0,256]) plt.show()
実行結果
マスク画像
3. compareHistによるヒストグラム比較
compareHistにより2つのヒストグラムの類似度を算出できる。ヒストグラム類似度は各階級の度数の差を積算することで求められる。算出アルゴリズムは複数ありいずれかを指定する。
compareHist の書式は以下の通り。
cv.compareHist(H1, H2, method)
引数 | 意味 |
---|---|
H1, H2 | 比較するヒストグラム |
method/td> | ヒストグラム算出アルゴリズムの指定
HISTCMP_CORREL HISTCMP_CHISQR HISTCMP_INTERSECT HISTCMP_BHATTACHARYYA HISTCMP_HELLINGER HISTCMP_CHISQR_ALT HISTCMP_KL_DIV |
'miyako.jpg'と'sunflower.jpg'(フリー写真素材ぱくたそより)についてチャンネル0(B)のヒストグラムを比較する例。
import cv2 import matplotlib.pyplot as plt img1 = cv2.imread('miyako.jpg') img2 = cv2.imread('sunflower.jpg') hist1 = cv2.calcHist([img1], [0], None, [256], [0,256]) plt.plot(hist1, color = 'b') plt.show() hist2 = cv2.calcHist([img2], [0], None, [256], [0,256]) plt.plot(hist2, color = 'b') plt.show() print(cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL))
実行結果
0.2950604095552982
4. リファレンス
OpenCV > Histograms > calcHist()
OpenCV > OpenCV Tutorials > Histogram Calculation
OpenCV > Histograms > compareHist()
OpenCV > OpenCV Tutorials > Histogram Comparison
OpenCV > Histograms > HistCompMethods
使用したバージョン:Python 3.8.8 / OpenCV 4.0.1
0 件のコメント:
コメントを投稿