2022年1月4日火曜日

【OpenCV】画像のヒストグラム算出とヒストグラム比較(calcHist, compareHist)

 画像処理ライブラリOpenCVcalcHistにより画像の画素値分布を示すヒストグラムを計算できる。また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 件のコメント:

コメントを投稿