前のページで利用した平均化フィルタでは,注目したい画素の近傍領域についてすべて同じ重み付けで平均値を計算しました.ガウシアンフィルタでは,注目したい画素の重みを最大にし,距離が遠くなるほど重みが小さくなるようにした加重平均を用います.ガウシアンフィルタは,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)
オリジナル
scikit-image の filters.gaussian
関数でガウシアンフィルタ処理を行います.なお,引数 sigma
はガウスカーネルの標準偏差で,この値を変化させることで平滑化の範囲(度合い)を調整できます.
gaussian_img = filters.gaussian(gray_img, sigma=1)
show(gaussian_img)
ガウシアンフィルタ (sigma=1)
引数 sigma
を 2 に変更するとより平滑化されることがわかります.
gaussian_img = filters.gaussian(gray_img, sigma=2)
show(gaussian_img)
ガウシアンフィルタ (sigma=2)
引数を変化させて徐々に平滑化が進む様子を確認します.
ガウシアンフィルタ (sigma=3)
ガウシアンフィルタ (sigma=4)
ガウシアンフィルタ (sigma=5)
ガウシアンフィルタ (sigma=6)
ガウシアンフィルタ (sigma=7)
ガウシアンフィルタ (sigma=8)
ガウシアンフィルタ (sigma=9)
ガウシアンフィルタの平滑化によって,ノイズを除去することができました.例えば,インク瓶表面の凹凸やラベルの文字,瓶が置いてあるテーブルの木目などのノイズが低減されています.一方で,輪郭などの情報も同時に低減してしまうことになります.次のページでは,輪郭の情報は維持しつつノイズを除去するバイラテラルフィルタを利用します.