[scikit-image] 6. ヒストグラム均等化による高コントラスト化

python

はじめに

skimage.filters の rank.equalizeにより画像のコントラストを高める方法について説明する。

コード

解説

この例では、ローカルヒストグラム均等化と呼ばれる方法を使用して、コントラストの低い画像を強調する。exposure.equalize_hist()で均等化した画像は、ほぼ線形の累積分布関数をもつ。ローカルヒストグラム均等化では、均等化する範囲を狭めて均等化するので、白飛びする領域が少なくなる。

モジュールのインポート

画像とヒストグラム、累積ヒストグラムを表示する関数

ax_cdf = ax_hist.twinx()で、ax.hist(ヒストグラム)とax.cdf(累積ヒストグラム)の軸を共有させて、同じ図中に表示する。ax.cdfのy軸は右側の第2軸となる。

ax_hist.ticklabel_format(axis=’y’, style=’scientific’, scilimits=(2,2),useMathText=True)でヒストグラムのy軸の頻度を指数表示で表示する。style=’scientific’で指数となり、scilimits=(2,2)とuseMathText=Trueで10の2乗表示となる。

xmin, xmax = dtype_range[image.dtype.type]
ax_hist.set_xlim(xmin, xmax)
でx軸の範囲を設定する。
オリジナル画像のimage.dtype.typeは numpy.float64であり、dtype_range[image.dtype.type]は(-1,1)となる。
equalizeした画像は、mage.dtype.typeは numpy.uint8であり、dtype_range[image.dtype.type]は(0,255)となる。

img_cdf, bins = exposure.cumulative_distribution(image, bins)で画像の累積ヒストグラムデータが作成できる。

画像の読み込み

rgb2grayでグレースケール画像に変換。

画像全体を均等化

exposure.equalize_hist(img)で画像全体でコントラストを均等化できる。

局所的均等化

rank.equalizeにより、local histogram equalizationをする。selem = disk(60)で均等化する範囲のサイズを決める。ここでは、半径30の円盤上の形の領域で均等化する。

画像の表示

参考

Local Histogram Equalization — skimage v0.15.0 docs
matplotlib.axes.Axes.ticklabel_format — Matplotlib 3.1.1 documentation
Module: morphology — skimage v0.16.dev0 docs

コメント