目次
はじめに
タイトルにある平滑化フィルタ処理(soomthing filterling)とは、画像を平滑化するフィルタ処理のことです。画像をぼかしたり、画像のノイズを除去したりする際に使用されることが多く、以下では平滑化で用いられる①平均化オペレータ(移動平均オペレータ)、②加重平均オペレータ、③中央値フィルタ処理について実装コードと合わせて簡単に説明します。
画像処理ライブラリのOpenCVを使っていくので、初めて使う方はインストールしておきましょう。
pip install opencv-python
①平均化オペレータ
注目画素(通常はオペレータの中心)の周辺の画素値の平均を計算し、注目画素の画素値とすることで平滑化を行うオペレータのことです。
平均化オペレータ例を図1に示します。それでは早速Pythonで平均化オペレータを実装し、3×3ピクセルで画像平滑化を行っていきます。
import cv2 import numpy as np file_src = 'pic_name.jpg' file_dst = 'pic_name_soomthing.jpg' # 画像読み込み img_src = cv2.imread(file_src, cv2.IMREAD_COLOR) cv2.namedWindow('src') cv2.namedWindow('dst') # 平均化オペレータ img_dst = cv2.blur(img_src, (3,3)) cv2.imshow('src', img_src) # 入力画像を表示 cv2.imshow('dst', img_dst) # 出力画像を表示 cv2.imwrite(file_dst, img_dst) # 処理結果の保存 cv2.waitKey(0) # キー入力待ち cv2.destroyAllWindows()
結果は図2に示した通り、元画像よりも若干ですがぼかすことに成功しました。ピクセル数を増やすほど、より画像をぼかすことができます。
②加重平均オペレータ
平均化オペレータとは異なり、注目(画素に近いほど大きな重みを付けオペレータです。
平均をとるだけの単純な平均化オペレータに比べて、入力画像を残す度合いが大きな平滑化を実現することができ、一般的に加重平均オペレータの方がより自然な平滑化を行うことができます。
平均オペレータと同様、まずは加重平均オペレータのイメージを図3に示します。
加重平均オペレータもPythonで実装してみましょう。
平均化オペレータとは違い、加重平均オペレータでは異なるピクセルに異なる重みを割り当てるため、カーネルを使って畳み込み演算を行っています。また、関数はfilter2Dを使っています。# カーネルを作成 kernel = np.array([[1, 2, 1], [2, 4, 2], [1, 2, 1]]) / 16.0 # 畳み込み演算 img_dst = cv2.filter2D(img_src, -1, kernel)結果は図4に示した通りです。
③中央値フィルタ処理
最後に図5に見られる黒い点のようなノイズ除去に効果のある中央値フィルタ処理を行って締めたいと思います。
中央値フィルタ処理は、これまでの処理とは違い、注目画素の周辺領域内のすべての画素値をソートし、その中央値を注目画素の画素値とするいわゆる非線形フィルタ処理です。
実際にやっていきましょう。# 中央値フィルタ処理 img_dst = cv2.medianBlur(img_src, 9)少し画像が荒くなってしまいましたが、スパイクノイズをうまく除去できたことが確認できました。