概要
グレースケール画像のヒストグラムを取得する方法を書きます。
numpyの関数histogramを使う方法
画像の読み込みにはopenCVを使ってます。
グレースケールで読み込むので、cv2.imreadの第二引数に"0"を書きます。
np.histogram(配列, bins)で、binごとの要素数とbin(階級)の境界の値を配列で返します。
以下のコードでは、それらをそれぞれimg_hist, img_binsに格納しています。
np.histogramに与える配列は、今回はグレースケール画像(2次元)なので、flatten()で1次元配列に変換しています。
最後に、matplotlibでヒストグラムの描画をしています。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 画像の読み込み
img = cv2.imread("Lena.jpg", 0)
# ヒストグラムの取得
img_hist, img_bins = np.histogram(np.array(img).flatten(), bins=np.arange(256+1))
# ヒストグラムの表示
plt.plot(img_hist)
plt.show()
OpenCVのcalcHistを使う方法
ヒストグラム取得の部分のみが上のnumpyの例と異なります。
cv2.calcHist(image, channel, mask, histsize, range)
channelはヒストグラムを計算する画像のチャンネル
:グレースケールであれば[0]
:カラー画像であればB, G, Rに相当する[0], [1], [2]を指定
maskは画像中の全画素のヒストグラムを計算する場合はNone
histsizeはbin(階級)の数。
rangeはヒストグラムを計算したい画素値の範囲。通常は[0, 256]を指定
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 画像の読み込み
img = cv2.imread("Lena.jpg", 0)
# ヒストグラムの取得
img_hist_cv = cv2.calcHist([img], [0], None, [256], [0, 256])
# ヒストグラムの表示
plt.plot(img_hist_cv)
plt.show()
まとめ
numpyの関数histogramとopencvのcalcHistを使う二種類の方法でヒストグラムを取得。
単に画像全体のヒストグラムを取るだけならnumpyでやったほうが簡単な印象