画像処理ライブラリOpenCVを使った平滑化フィルタ処理の手法

目次

はじめに

タイトルにある平滑化フィルタ処理(soomthing filterling)とは、画像を平滑化するフィルタ処理のことです。画像をぼかしたり、画像のノイズを除去したりする際に使用されることが多く、以下では平滑化で用いられる①平均化オペレータ(移動平均オペレータ)②加重平均オペレータ③中央値フィルタ処理について実装コードと合わせて簡単に説明します。
画像処理ライブラリのOpenCVを使っていくので、初めて使う方はインストールしておきましょう。

pip install opencv-python

①平均化オペレータ

注目画素(通常はオペレータの中心)の周辺の画素値の平均を計算し、注目画素の画素値とすることで平滑化を行うオペレータのことです。
平均化オペレータ例を図1に示します。

  
図1 平均化オペレータの例(左:3×3ピクセル、右:5×5ピクセル)
それでは早速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に示した通り、元画像よりも若干ですがぼかすことに成功しました。ピクセル数を増やすほど、より画像をぼかすことができます。

 
図2 左が元画像 右が平滑化を施した画像

②加重平均オペレータ

平均化オペレータとは異なり、注目(画素に近いほど大きな重みを付けオペレータです。 平均をとるだけの単純な平均化オペレータに比べて、入力画像を残す度合いが大きな平滑化を実現することができ、一般的に加重平均オペレータの方がより自然な平滑化を行うことができます。 平均オペレータと同様、まずは加重平均オペレータのイメージを図3に示します。
 
図3 加重平均オペレータの例(左:3×3ピクセル、右:5×5ピクセル)
加重平均オペレータも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に示した通りです。
 
図4 加重平均オペレータにより平滑化の結果

③中央値フィルタ処理

最後に図5に見られる黒い点のようなノイズ除去に効果のある中央値フィルタ処理を行って締めたいと思います。 中央値フィルタ処理は、これまでの処理とは違い、注目画素の周辺領域内のすべての画素値をソートし、その中央値を注目画素の画素値とするいわゆる非線形フィルタ処理です。 実際にやっていきましょう。
# 中央値フィルタ処理
img_dst = cv2.medianBlur(img_src, 9)
 
図6 中央値フィルタ処理によるノイズ除去(左が元画像、右が処理後の画像)
少し画像が荒くなってしまいましたが、スパイクノイズをうまく除去できたことが確認できました。

まとめ

平滑化フィルタ処理について簡単に説明し、平均化オペレータ・加重平均オペレータ・中央値フィルタ処理という3つの処理についてPythonで実装する方法をご紹介いたしました。 特にノイズ処理は実務でも役に立ちそうなので、画像が荒くならないようより高度なGaussianフィルタの実装もやってみたいと思います。