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

python

はじめに

この記事では、scikit-imageライブラリのrank.equalize関数を使ったヒストグラム均等化について解説しています。ヒストグラム均等化は、暗い画像や低コントラスト画像の視認性を向上させる画像処理技術です。医療画像や天体写真など、コントラストが重要な分野で特に有用なこの技術の基本原理とPythonによる実装方法を紹介しています。

コード

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

解説

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

モジュールのインポート

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

「ax_cdf = ax_hist.twinx()」を使うと、ヒストグラム(ax.hist)と累積ヒストグラム(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処理後の画像では、「image.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 0.25.2 documentation
matplotlib.axes.Axes.ticklabel_format — Matplotlib 3.10.5 documentation
skimage.morphology — skimage 0.26.0rc0.dev0 documentation

コメント