OpenCV

画像処理 「OpenCV 4」画像をぼかす・平滑化する

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()
実行結果