Warning: Undefined variable $position in /home/pystyles/pystyle.info/public_html/wp/wp-content/themes/lionblog/functions.php on line 4897

OpenCV – 平均化フィルタとガウシアンフィルタについて

OpenCV – 平均化フィルタとガウシアンフィルタについて

概要

平均化フィルタとガウシアンフィルタについて解説し、OpenCV での適用方法について紹介します。

Advertisement

平均化フィルタ

平均化フィルタ (averaging filter) は、カーネル内の画素の平均を計算するフィルタです。

$$ \text{dst}(x, y) = \frac{1}{N^2} \sum_{i = 1}^N \sum_{j = 1}^N \text{src}(x + i, y + j) $$

フィルタのサイズが $N \times N$ の場合、各フィルタの値を $f(i, j) = \frac{1}{N^2}$ とすることで実現できます。

(3, 3) の平均化フィルタ

$\frac{1}{9}$ $\frac{1}{9}$ $\frac{1}{9}$
$\frac{1}{9}$ $\frac{1}{9}$ $\frac{1}{9}$
$\frac{1}{9}$ $\frac{1}{9}$ $\frac{1}{9}$

平均化フィルタは画像のエッジを滑らかにします。

エッジが滑らかになることで、ノイズが軽減します。

cv2.blur

cv2.blur() で平均化フィルタを適用できます。

sample.jpg

In [1]:
import cv2
import numpy as np
from IPython.display import Image, display


def imshow(img):
    """ndarray 配列をインラインで Notebook 上に表示する。
    """
    ret, encoded = cv2.imencode(".jpg", img)
    display(Image(encoded))


# 画像を読み込む。
img = cv2.imread("sample.jpg")

# フィルタリングを行う。
dst = cv2.blur(img, (3, 3))
imshow(dst)

エッジが滑らかになることで、画像全体がぼやけた感じになります。

ガウシアンフィルタ

ガウシアンフィルタ (Gaussian filter) は、ガウス分布 (正規分布)で重み付けしたカーネルを使用するフィルタです。ガウス分布は以下のような単峰型の分布です。

ガウシアンフィルタは以下のように導出できます。

多次元正規分布の確率密度関数

$$ f(\bm{x}) = \dfrac{1}{(2\pi)^{\frac{n}{2}}\sqrt{|\Sigma|}} \exp \left\{ -\dfrac{1}{2}(\bm{x} – \bm{\mu})^T \Sigma^{-1} (\bm{x} – \bm{\mu})\right\} $$

について、

$ \Sigma = \begin{pmatrix} \sigma_x & 0 \\ 0 & \sigma_y \\ \end{pmatrix} $, $n = 2$, $\bm{x} = (x, y)^T$, $\bm{\mu} = \bm{0}$ とおくと、

$$ f(x, y) = \frac{1}{\sqrt{2 \pi \sigma_x \sigma_y}} \exp \left( -\frac{1}{2} \left(\frac{x^2}{\sigma_x} + \frac{y^2}{\sigma_y} \right) \right) $$

$\sigma_x = \sigma_y = \sigma$ の場合は

$$ f(x, y) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp \left( -\frac{x^2 + y^2}{2 \sigma^2} \right) $$

ガウシアンフィルタは画像のエッジを滑らかにします。

エッジが滑らかになることで、ノイズが軽減します。

Advertisement

cv2.GaussianBlur

cv2.GaussianBlur() でガウシアンフィルタを適用できます。

dst = cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

simgaX のみ指定した場合は、sigmaX = sigmaY となります。

In [2]:
dst = cv2.GaussianBlur(img, (5, 5), sigmaX=1)
imshow(dst)