OpenCV 画像平滑化処理

画像処理において、平滑化処理(ぼかし処理とも呼ばれます)は、画像内のノイズや細部を減らすための一般的な操作です。

OpenCV にはさまざまな平滑化処理の方法があります。この記事では、よく使われる4つの平滑化処理技術(平均値フィルタ、ガウシアンフィルタ、メディアンフィルタ、バイラテラルフィルタ)について詳しく解説します。

1. 平均値フィルタ (cv2.blur())

平均値フィルタは、最も簡単な平滑化処理方法の1つです。

平均値フィルタの原理は、画像内の各ピクセルの値を、その周囲のピクセルの平均値に置き換えることです。

平均値フィルタはノイズを効果的に除去できますが、画像がぼやける可能性があります。

使用方法

実例

import cv2

# 画像を読み込む
image = cv2.imread('image.jpg')

# 平均値フィルタを適用する
blurred_image = cv2.blur(image, (5, 5))

# 結果を表示する
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.blur(image, (5, 5)) パラメータ説明

  • image: 入力画像。
  • (5, 5): フィルタカーネルのサイズ。水平・垂直方向に平均を取る範囲を表します。

適用シーン

平均値フィルタは、画像内のランダムノイズの除去に適していますが、画像のエッジがぼやける可能性があります。

2. ガウシアンフィルタ (cv2.GaussianBlur())

ガウシアンフィルタは、ガウス関数に基づく平滑化処理方法です。平均値フィルタとは異なり、ガウシアンフィルタはピクセルの平均値を計算する際に、中心ピクセルにより高い重みを与え、周辺ピクセルには低い重みを与えます。

ガウシアンフィルタは、ノイズを除去しながら、画像のエッジ情報をよりよく保持できます。

使用方法

実例

import cv2

# 画像を読み込む
image = cv2.imread('image.jpg')

# ガウシアンフィルタを適用する
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)

# 結果を表示する
cv2.imshow('Gaussian Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.GaussianBlur(image, (5, 5), 0) パラメータ説明

  • image: 入力画像。
  • (5, 5): フィルタカーネルのサイズ。
  • 0: ガウスカーネルの標準偏差。0の場合は、カーネルサイズに基づいて自動的に計算されます。

適用シーン

ガウシアンフィルタは、画像内のガウスノイズの除去に適しており、画像のエッジ情報の保持にも優れています。

3. メディアンフィルタ (cv2.medianBlur())

メディアンフィルタは、非線形の平滑化処理方法です。その原理は、画像内の各ピクセルの値を、その周囲のピクセルの中央値に置き換えることです。

メディアンフィルタは、塩コショウノイズ(画像内にランダムに現れる白黒の点)の除去に非常に効果的です。

使用方法

実例

import cv2

# 画像を読み込む
image = cv2.imread('image.jpg')

# メディアンフィルタを適用する
blurred_image = cv2.medianBlur(image, 5)

# 結果を表示する
cv2.imshow('Median Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.medianBlur(image, 5) パラメータ説明

  • image: 入力画像。
  • 5: フィルタカーネルのサイズ。奇数である必要があります。

適用シーン

メディアンフィルタは、画像内の塩コショウノイズの除去に適しており、画像のエッジ情報の保持にも優れています。

4. バイラテラルフィルタ (cv2.bilateralFilter())

バイラテラルフィルタは、空間的近接性とピクセル値の類似性を組み合わせた非線形の平滑化処理方法です。

ガウシアンフィルタとは異なり、バイラテラルフィルタは画像を平滑化しながら、画像のエッジ情報を保持できます。これは、バイラテラルフィルタがピクセル間の空間距離だけでなく、ピクセル値の差も考慮するためです。

使用方法

実例

import cv2

# 画像を読み込む
image = cv2.imread('image.jpg')

# バイラテラルフィルタを適用する
blurred_image = cv2.bilateralFilter(image, 9, 75, 75)

# 結果を表示する
cv2.imshow('Bilateral Filtered Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.bilateralFilter(image, 9, 75, 75) パラメータ説明

  • image: 入力画像。
  • 9: フィルタカーネルのサイズ。
  • 75: 色空間の標準偏差。ピクセル値の類似度の重みを制御します。
  • 75: 座標空間の標準偏差。空間距離の重みを制御します。

適用シーン

バイラテラルフィルタは、ノイズを除去しながら画像のエッジ情報を保持するのに適しており、画像の美化や前処理によく使用されます。

まとめ

OpenCV にはさまざまな画像平滑化処理方法があり、それぞれに独自の利点と適用シーンがあります。平均値フィルタはシンプルで使いやすいですが、画像がぼやける可能性があります。ガウシアンフィルタは、ノイズを除去しながらエッジ情報を比較的よく保持できます。メディアンフィルタは特に塩コショウノイズの除去に適しています。バイラテラルフィルタは、エッジ情報の保持に優れています。具体的な適用シーンに応じて適切な平滑化処理方法を選択することで、画像処理の効果を大幅に向上させることができます。

その他の拡張