OpenCVで用意されている、4つの画像のぼかし方を確認します。
平均フィルタ
cv2.blur() と cv2.boxFilter() のいずれかを利用して、画像をカーネルで畳み込んで平均化できます。単純にカーネル領域の下にある全てのピクセルの平均値を取り、その平均値で中心要素を置き換えます。
cv2.blur(image, (5, 5))
ガウシアンフィルタ
ガウシアンフィルタは白色のノイズの除去に使えます。
OpenCVでは、ガウスカーネルを用いて画像をぼかす関数として、cv2.GaussianBlur() が用意されています。このカーネルは,カーネルサイズ(ksize)、ガウスカーネルのx,y方向の標準偏差 (sigmaX、sigmaY)というパラメータを用いて制御することができます。
また、cv2.getGaussianKernel() で、 ガウシアンフィルタが作成できます。
cv2.GaussianBlur(image, (5, 5), 0)
中央値フィルタ
カーネル内の全画素の中央値を計算します。ごま塩ノイズ(飛び地で画素が壊れている場合)に使えます。出力結果は原画像の中から取得します。
cv2.medianBlur(image, 5)
バイラテラルフィルタ
他の3つとは異なり、エッジをシャープに保ちながら画像をぼかすことができます。
cv2.bilateralFilter(image, 9, 100, 100)
サンプルコード
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("image.png")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, None, fx=0.1, fy=0.1,
interpolation=cv2.INTER_NEAREST)
plt.subplot(2, 3, 1)
plt.title('original')
plt.imshow(image)
result_image = cv2.blur(image, (5, 5))
plt.subplot(2, 3, 2)
plt.title('cv2.blur')
plt.imshow(result_image)
result_image = cv2.GaussianBlur(image, (5, 5), 0)
plt.subplot(2, 3, 3)
plt.title('cv2.GaussianBlur')
plt.imshow(result_image)
result_image = cv2.medianBlur(image, 5)
plt.subplot(2, 3, 4)
plt.title('cv2.medianBlur')
plt.imshow(result_image)
result_image = cv2.bilateralFilter(image, 9, 100, 100)
plt.subplot(2, 3, 5)
plt.title('cv2.bilateralFilter')
plt.imshow(result_image)
plt.show()