スポンサーリンク
スポンサーリンク

【OpenCV】ヒストグラムを作って画像の特徴を知る方法【Python】

見習い

ヒストグラムとはなんですか?

管理人

ヒストグラムとは、画像内の画素値の度数分布を表したものです。

見習い

・・・度数?分布?

管理人

つまり、画素値0〜255まで、どの画素値が何個あるかを表したグラフのことです。

ヒストグラムとは

ヒストグラムは、画像内の画素値の度数分布を表したもので、画像の大まかな特徴や偏りを調べるためのものです。

例えばこの画像

出典:https://www.pakutaso.com/20181100333post-18689.html

このように雲や空などが大部分を占める明るい画像だと、ヒストグラムはこのようになります。

左から右に、0〜255となっていくのですが、このヒストグラムを見ると255に近い画素値がかなり多いことがわかります。

逆に暗い画像だと、左(0に近い方向)に山が集中します。

こういった風に画像の特徴を知ることができる、それがヒストグラムです。

OpenCVでヒストグラムを作る

見習い

それじゃあヒストグラムはどうやって作るんですか?

管理人

OpenCVの関数を使えば簡単に作れるよ

プログラム(Python)

使用する画像

(main.py)

結果

解説

ヒストグラムを作成する際は、画像として作成するので、まず最初に画像配列を作成します。

画像配列は「numpy.ndarray」型となるので、「numpy」の「zeros」関数で、初期値「0」の画像配列を作成します。

 

次に、「calcHist」関数を使って度数分布を求めていきます。

第1引数:

ソース画像配列。「[]」で括ることによって、画像配列データとして認識させる。

具体的には、「numpy.ndarray」型から「list」型へ変換する。

第2引数:

チャンネルの種類。[0]なら青、[1]なら緑、[2]なら赤を調べる。

ソース画像がグレースケールなら[0]を指定する。

第3引数:

マスク画像。マスク画像を指定しない場合は、「None」を指定する。

第4引数:

ビン(階級)の数。今回は全画素値を調べるので、[256]を指定。

第5引数:

計測する画素値の範囲。今回は全画素値を調べるので、[0, 256]を指定。

「calcHist」関数で返ってくる値は「numpy.ndarray」型で、256個の配列の中に各画素値の度数が代入されています。

見習い

例えば配列番号「120」には、画素値120の数が代入されているということですか?

管理人

その通りです。「hist」変数には256×1の二次元配列に、それぞれの度数が代入されています。

 

ヒストグラムが取得できたら、描画に移ります。

今回は「line」関数で縦線を256本描画して、棒グラフを作成していきます。

「line」関数の引数には、描画対象となる画像と、始点・終点、そして線の色が入ります。

青・緑・赤チャンネルのヒストグラムを作成

見習い

さっきは[0]を指定したから、青チャンネルの度数分布を調べてことになりますね。

管理人

そうです。なので今度は3つのチャンネル全てを調べて、画像の特徴を掴んでみましょう。

見習い

でも棒グラフだと重なって、他のチャンネルが見えなくなるのでは?

管理人

いい質問です。なので今度は折れ線グラフで描画してみましょう。

プログラム

(main.py)

結果

解説

注目は「zeros」関数内の第1引数です。

先ほどは[100, 256]と指定しましたが、今度は[100, 256, 3]と指定しています。

この「3」は、3チャンネル分のことを表しており、「100×256」の画像が青緑赤の3チャンネル分作成されます。

 

ヒストグラムの取得や描画作業も、3チャンネルあるので、3回行っています。

またその際に、調べるチャンネルや線の色をチャンネル毎に変更します。(マーカー部分)

見習い

ヒストグラムを見ると、画像全体が赤みがかっていることがわかりますね!

管理人

いい視点ですね。

見習い

となると、もし青空の画像で行ったら青チャンネルが右に偏りそうね。

管理人

色々試してみるといいかもしれませんね。

【例】様々な画像のヒストグラムを検証

北アルプスから見る天の川

元の画像

https://www.pakutaso.com/20190134018post-17712.html

ヒストグラム

全体的に暗い画像であることが言えます。

また、青みがかっているというよりかは、黒に近いので「RGB」間での偏りは無いと言えます。

入道崎に沈む夕陽とレイライン

元の画像

https://www.pakutaso.com/20190152014post-18745.html

ヒストグラム

夕焼けによって、「R(赤)」の値が極端に右に寄っています。

また、オレンジがかった色が多いので、「G(緑)」の値も多少の偏りを見せています。

見習い

オレンジは「明るい赤」と「暗い緑」で表現できますからね。

霧に覆われた森の中の草原

元の画像

https://www.pakutaso.com/20181135332post-18677.html

ヒストグラム

緑だけが偏ると思いきや、「B(青)」が一番偏っていることがわかります。

これは靄(もや)の部分を表現するのに、青の成分を多く使っているからだと考えられます。

 

このようにヒストグラムを用いることで、感覚だけではわからない画像の特徴を正確に知ることができます。

コメント