Python+OpenCV|ガウシアンフィルタ

ガウシアンフィルタとは

ガウシアンフィルタは、平均0、標準偏差σのガウス分布を近傍画素値に重み付けを行います。

標準偏差σの値が大きくなるほど、ガウス分布が平たくなり、重みの差が小さくなるため、平滑化の効果も大きくなります。

ガウス分布


$$h_g=\frac{ 1 }{ 2\pi\sigma^2 }\exp{(-\frac{x^2+y^2}{2\sigma^2})}$$

半値幅(メモ)

平滑化の度合いは、半値幅(FWHM)で指定することもできる。

ガウス分布のFWHMは、最大値の半分の位置でのガウス分布の幅を表します。

このFWHMは、次の式で表されます。

$$FWHM = 2\sigma\sqrt{ 2\ln2}$$

値はおよそ次のようになる。
$$FWHM \simeq 2.354820\sigma$$

Python+OpenCV

OpenCVでは、ガウシアンフィルタを

cv2.GaussianBlur(img,(3, 3), sigmaX, sigmaY)

の関数が用意されています。
imgには、画像を指定します。
(3, 3)は、カーネルサイズです。
sigmaXは、横軸の標準偏差です。
sigmaYは、縦軸の標準偏差です。

sigmaXのみの指定もできます。その時は、sigmaYにはsigmaXと同じ値になります。

プログラム

%matplotlib inline
import matplotlib.pyplot as plt
import cv2
import numpy as np

gray=cv2.imread('haruna_kankore.png',0)

#元画像を保存します。
cv2.imwrite('gray_model.png', gray)

#ガウシアンフィルタ
gaussian = cv2.GaussianBlur(gray, ksize=(3, 3), sigmaX=10)
#保存
cv2.imwrite('gaussian_model.png', gaussian)

#ヒストグラム
plt.hist(gray.ravel(),256,[0,256], color='red', label='gray')
plt.hist(gaussian.ravel(),256,[0,256], color='blue', label='gaussian')
plt.legend()
plt.savefig('figure.png')
plt.show()

ガウシアンフィルタ後の画像

元画像

ガウシアンフィルタ:σ=10

ヒストグラム

参考書