はじめに
skimageのexposure. histogramで画像のヒストグラムを作成する方法について説明する。画像のヒストグラムとは、各ピクセルの値が画像全体でどの程度あるかを視覚的に表示したものである。また、skimage, numpy, matplotlibの各ライブラリでヒストグラムを作成する関数を比較した結果も説明する。
解説
モジュールのインポートなど
バージョン
画像の読み込み
パロディア属スミレ丸の画像を読み込む。img_as_floatでデータ範囲を0-1にし、rgb2grayによりグレースケール画像に変換した。
読み込んだ画像を表示すると以下のようになる。

ヒストグラムデータの作成
exposure.histogram
ヒストグラム化したい画像とヒストグラムの計算に使用するビンの数を指定する。
np.histogram
ヒストグラム化したい画像とヒストグラムの計算に使用するビンの数を指定する。binのとる範囲は画像の最小値と最大値の間の範囲となる。
plt.hist (ax.hist)
ヒストグラム化したい画像とヒストグラムの計算に使用するビンの数を指定する。画像は1次元配列に変換する必要がある。その他はnp.histogramと同様となる。
binの比較
skimage.exposure.histogramのビンのみ形状が10で、numpyとmatplotlibのヒストグラムのビンは11となる。これはskimageのヒストグラムのビンの値はビンの中心となっているためである。一方、numpyとmatplotlibはビンのエッジを返すためで形状が11となる。
頻度の比較
頻度の値については、skimage, numpy, matplotlibで同じとなる。
ヒストグラムの表示
skimage, numpy, matplotlibで作成したヒストグラムデータをmatplotlibのbarで表示すると以下のようになる。numpyのヒストグラムを表示するには、np_bin[:-1]かnp_bin[1:]として配列の形状を揃える必要がある。
matpltlibのax.histの場合、skimageのヒストグラムと同様にbinの中央の値でbarを表示するので、matpltlibとskimageのヒストグラムは同じようになる。

オフセットをかけて表示すると以下のようになる。

規格化(normalize)
skimageでは、normalize=Trueでヒストグラムの規格化(正規化)することができ、頻度の値の合計は1となる。
規格化したヒストグラムは以下のようになる。

一方、matplotlibで規格化するには、density=Trueとする。その結果は以下のようになる。

これの頻度の合計値はそのままでは1とならない。1にするには、ビンの幅(np.diff(plt_bins)[0])をかける必要がある。
np.histogramの場合も同様となる。
コードをダウンロード(.pyファイル)
コードをダウンロード(.ipynbファイル)
コメント