[scikit-image] 52. 適応的しきい値処理による画像のバイナリ変換:threshold_niblackとthreshold_sauvola

python

はじめに

画像処理において、しきい値処理(二値化)は重要な前処理ステップの一つです。通常のグローバルしきい値処理では、画像全体に対して一つのしきい値を適用しますが、照明条件が不均一な画像や複雑な背景を持つ画像では十分な結果が得られないことがあります。

この記事では、局所的な領域ごとに異なるしきい値を計算する「適応的しきい値処理」の手法として、scikit-imageライブラリに実装されているNiblack法とSauvola法に焦点を当てて解説します。

コード

解説

モジュールのインポート

画像データの読み込み

Epithelantha属の種子サンプルを使用し、rgb2gray関数でグレースケール画像に変換します。

大津の2値化

大津の2値化によって単一のしきい値を算出し、そのしきい値処理を適用することでバイナリ画像が生成されます。

Niblack, Sauvolaローカルしきい値による2値化

これらのしきい値処理は単一のしきい値を用いるのではなく、各ピクセルの周辺領域の平均と標準偏差を用いた式によってしきい値を設定する手法です。Sauvola法はNiblack法の改良版となります。詳細については下記の参考文献をご参照ください。window_sizeは計算に使用する局所領域の大きさを決定するパラメータで、奇数整数で指定します。

skimage.filters — skimage 0.25.2 documentation
skimage.filters — skimage 0.25.2 documentation

画像の表示

図の構成は左上がオリジナル画像、右上が大津の2値化を適用したバイナリ画像、左下がNiblackしきい値処理を適用したバイナリ画像、右下がSauvolaしきい値処理を適用したバイナリ画像となっています。特にSauvola法によるバイナリ画像は、対象物の特徴を適切に分離できているように見えます。

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

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

参考

Niblack and Sauvola Thresholding — skimage 0.25.2 documentation
skimage.filters — skimage 0.25.2 documentation
skimage.filters — skimage 0.25.2 documentation

コメント