概要
画像の画素値のヒストグラムを作成することで、画像の特性を理解し、2 値化などの処理に役立てることができます。この記事では、OpenCV の cv2.calcHist()
を使用して画像のヒストグラムを作成する方法を紹介します。
画像のヒストグラム
画像のヒストグラムとは、横軸に画素値、縦軸にその画素値の頻度を取った ヒストグラム です。画像のヒストグラムを使用することで、画像の明るさやコントラストの分布を理解することができます。 カラー画像の場合、画像は複数のチャンネルで構成されているため、各チャンネルごとにヒストグラムを作成する必要があります。これにより、色ごとの画素値の分布も確認することができます。
cv2.calcHist()
OpenCV の calcHist() を使用すると、画像から指定したチャンネルのヒストグラムを計算できます。
名前 | 型 | デフォルト値 |
---|---|---|
images | list of ndarray | |
ヒストグラムを計算する画像の一覧。通常は1枚の画像をリストにして渡す。 | ||
channels | list of int | |
ヒストグラムを計算するチャンネルの一覧 | ||
mask | ndarray | |
ヒストグラムを計算する領域を指定するためのマスク画像 | ||
histSize | list of int | |
ヒストグラムのビンの数 | ||
ranges | list of int | |
ヒストグラムの範囲。この範囲外の画素値は集計対象外となる。 |
名前 | 説明 | ||
---|---|---|---|
hist | ヒストグラム |
channels
、 histSize
、 ranges
の指定方法は少々複雑なので、詳しく見ていきます。
1 次元ヒストグラム
1 次元ヒストグラムの場合、以下のように指定します。
ch
は 1 次元ヒストグラムを計算するチャンネルを指定します。bins
はヒストグラムのビンの数を指定します。例えば、bins=[15]
とすると、指定範囲を 15 等分します。l, u
はヒストグラムを作成する範囲 を指定します。例えば、ranges=[0, 256]
とすると、画素値の範囲が 0 から 255 までになります。
例えば、bins=[15], ranges=[0, 256]
とした場合、 を 15 等分したビンが作成されます。

グレースケール画像のヒストグラム
グレースケール画像のヒストグラムを計算する場合、channels=[0], histSize=[ビンの数], ranges=[下限, 上限]
と指定します。
matplotlib でヒストグラムを描画します。

折れ線グラフで描画するコードも紹介します。

カラー画像のヒストグラム
カラー画像のヒストグラムする場合、channels=[チャンネル], histSize=[ビンの数], ranges=[下限, 上限]
と指定します。
例えば、BGR 画像の場合、0 が blue、1 が green、2 が red になります。

2 次元ヒストグラム
2 次元ヒストグラムの場合、以下のように指定します。
ch1, ch2
は 1 次元ヒストグラムを計算するチャンネルを指定します。bins1
はチャンネルch1
のビンの数、bins2
はチャンネルch2
のビンの数を指定します。l1, u1
はチャンネルch1
のヒストグラムを作成する範囲 、l2, u2
はチャンネルch2
のヒストグラムを作成する範囲 を指定します。
例えば、bins=[15, 17], ranges=[0, 256, 0, 256]
とした場合、 軸は [0, 256]
を 15 等分、 軸は [0, 256]
を 17 等分したビンが作成されます。
HSV 画像の 2 次元ヒストグラムを作成する
2 次元ヒストグラムは、ヒストグラムの形状は 2 次元配列になるため、imshow()
を使用して描画します。

参考文献
- ディジタル画像処理 P58
- OpenCV: Histograms
コメント