Python入門トップページ


目次

  1. scikit-image のインストール
  2. Matplotlib による画像の表示
  3. 表示関数の定義
  4. RGBA から RGB への変換
  5. グレースケールをイメージする
  6. RGB からグレースケールへの変換
    1. RGB 平均
    2. ITU-R Rec BT.602
    3. Contemporary CRT phosphors (Rec 709)
    4. 3種類の比較
    5. scikit-image の rgb2gray 関数
  7. 平均化フィルタ
    1. 平均化フィルタの自作
    2. 平均化フィルタの一般化
    3. scikit-image の平均化フィルタ関数
  8. ガウシアンフィルタ
  9. バイラテラルフィルタ
  10. ランダムノイズとフィルタ
  11. ソーベルフィルタ
    1. ソーベルフィルタの自作
    2. scikit-image の sobel 関数
    3. 平均化/ガウシアンフィルタとソーベルフィルタの併用

画像フィルタの作成と利用

ガウシアンフィルタ

前のページで利用した平均化フィルタでは,注目したい画素の近傍領域についてすべて同じ重み付けで平均値を計算しました.ガウシアンフィルタでは,注目したい画素の重みを最大にし,距離が遠くなるほど重みが小さくなるようにした加重平均を用います.ガウシアンフィルタは,scikit-image の filters.gaussian 関数で提供されています.なお,filters.gaussian 関数の詳細やソースコードはここを参照してください.

まず,「表示関数の定義」ページを参照し,ライブラリのインポートと関数の定義を実行したあと,画像ファイルをグレースケールに変換して表示します.

ink_img = plt.imread('ink.png')
img = color.rgba2rgb(ink_img)
gray_img = color.rgb2gray(img)
show(gray_img)
オリジナル
filters_20_gray.png

scikit-image の filters.gaussian 関数でガウシアンフィルタ処理を行います.なお,引数 sigma はガウスカーネルの標準偏差で,この値を変化させることで平滑化の範囲(度合い)を調整できます.

gaussian_img = filters.gaussian(gray_img, sigma=1)
show(gaussian_img)
ガウシアンフィルタ (sigma=1)
filters_31_gaussian1.png

引数 sigma を 2 に変更するとより平滑化されることがわかります.

gaussian_img = filters.gaussian(gray_img, sigma=2)
show(gaussian_img)
ガウシアンフィルタ (sigma=2)
filters_31_gaussian2.png

引数を変化させて徐々に平滑化が進む様子を確認します.

ガウシアンフィルタ (sigma=3)
filters_31_gaussian3.png
ガウシアンフィルタ (sigma=4)
filters_31_gaussian4.png
ガウシアンフィルタ (sigma=5)
filters_31_gaussian5.png
ガウシアンフィルタ (sigma=6)
filters_31_gaussian6.png
ガウシアンフィルタ (sigma=7)
filters_31_gaussian7.png
ガウシアンフィルタ (sigma=8)
filters_31_gaussian8.png
ガウシアンフィルタ (sigma=9)
filters_31_gaussian9.png

ガウシアンフィルタの平滑化によって,ノイズを除去することができました.例えば,インク瓶表面の凹凸やラベルの文字,瓶が置いてあるテーブルの木目などのノイズが低減されています.一方で,輪郭などの情報も同時に低減してしまうことになります.次のページでは,輪郭の情報は維持しつつノイズを除去するバイラテラルフィルタを利用します.

目次に戻る