Gaussian Blur
ガウシアンぼかしは、コンピュータービジョンや前処理で、重み付きピクセル平均を用いてノイズや細部を抑える画像平滑化フィルターです。
ガウシアンぼかしは、各ピクセルを周辺ピクセルの重み付き平均に置き換える画像平滑化手法です。近くのピクセルほど大きな重みが与えられます。重みは釣鐘型のガウス分布に従い、ノイズや細部を抑えるソフトなぼかしを生成します。ガウシアン平滑化とも呼ばれ、画像を解析用に整えるため、コンピュータービジョンやデータ前処理で広く使用されています。
ガウシアンぼかしの仕組み#
このフィルターは、カーネルと呼ばれる小さな重みの格子を画像上で移動させます。各位置で、周辺ピクセルの値にそれぞれの重みを掛け、その結果を合計します。この処理は畳み込みです。重みの合計は1になるため、カーネルがサンプリングするすべての値の明るさが同じ場合、ピクセルは変化しません。ガウシアンぼかしはローパスフィルターとして機能し、ノイズ、テクスチャ、鋭い境界など、ピクセル間の急激な変化を抑制します。
結果を決める設定は2つあります。シグマはガウス分布の標準偏差で、重みの広がりを制御します。シグマを大きくすると、平滑化が強くなります。カーネルサイズは、周囲の画像をどの範囲まで含めるかを決めます。カーネルを大きくすると、より広いガウス分布に対応できますが、小さすぎるカーネルでは分布の裾が切り落とされます。カーネル半径は中心からカーネルの端までの距離を示します。半径が3ピクセルの場合、幅7ピクセルのカーネルになります。
画像の境界では、カーネルの一部が利用可能なピクセルの範囲外になります。画像を反射させると周辺の内容が拡張されますが、欠損領域をゼロで埋めると暗い値が加わり、境界が暗くなることがあります。そのため、境界の処理方法によって画像の端付近のフィルター出力が変わります。
コンピュータービジョンと機械学習での用途#
ガウシアン平滑化は、画像構造を解析する空間スケールを制御することで、特徴抽出を支援します。マルチスケールでの利用は、1959~1962年の飯島泰蔵によるガウススケール空間の研究に端を発します。この研究は、さまざまなぼかしレベルで画像を表現するための基礎を確立しました。
scikit-imageのCannyエッジ検出の実装では、ガウシアン平滑化によってノイズを低減してから、Sobel演算子を使って勾配を推定します。平滑化しない場合、ノイズによって生じる追加の輝度変化が物体の境界と競合します。平滑化のスケールを大きくすると細かなエッジも除去されるため、検出後に残る輪郭が変わります。
文書の画像セグメンテーションでは、ガウス重み付き局所平均を用いて適応的なしきい値処理を行えます。各ピクセルのしきい値は、近傍の重み付き平均からオフセットを引いて計算されます。これにより、スキャンしたページの局所的なしきい値処理のように、照明にむらがある場合でもテキストと背景を分離できます。
データ拡張としてガウシアンぼかしを適用すると、バウンディングボックスやキーポイントの座標を保ちながら、トレーニング画像をぼかしたバージョンを作成できます。Ultralytics YOLOは、カスタムAlbumentations変換を通じてA.GaussianBlurをサポートしているため、YOLO26のトレーニングに制御されたぼかしのバリエーションを含められます。
ガウシアンぼかしと他のフィルターの比較#
平滑化手法の選択によって、画像情報の残り方が変わります。
- 平均ぼかしはボックスぼかしとも呼ばれ、ウィンドウ内のすべてのピクセルに同じ重みを与えます。ガウシアンぼかしは近くのピクセルを重視し、重みがより滑らかに変化する平均を作ります。
- メディアンぼかしは、ピクセルを近傍の中央値に置き換えます。孤立した明るいピクセルや暗いピクセルによるごま塩ノイズの除去に特に効果的です。
- バイラテラルフィルタリングは、空間的な距離と輝度の類似度の両方を用いて、鋭い境界を保ちながらノイズを低減します。ガウシアンぼかしは位置だけに基づいてピクセルに重みを付けるため、エッジもぼかします。
Pythonでガウシアンぼかしを適用する#
OpenCVには、ガウシアン平滑化を行うcv2.GaussianBlurが用意されています。pip install opencv-pythonでPythonパッケージをインストールし、並べて比較した画像を保存します。
from urllib.request import urlopen
import cv2
import numpy as np
with urlopen("https://ultralytics.com/images/bus.jpg") as response:
image_bytes = np.frombuffer(response.read(), dtype=np.uint8)
image = cv2.imdecode(image_bytes, cv2.IMREAD_COLOR)
blurred = cv2.GaussianBlur(image, (15, 15), sigmaX=3)
comparison = cv2.hconcat([image, blurred])
cv2.imwrite("gaussian_blur_comparison.jpg", comparison)保存した画像では、左側に元の画像、右側に平滑化した結果が配置されます。15 x 15のカーネルでは、sigmaYを省略するとその値がsigmaXになるため、両方向に3ピクセルのシグマが使用されます。
ガウシアンカーネルは分離可能です。水平および垂直方向の1次元フィルターで、対応する2次元のぼかしを生成できます。7 x 7カーネルの場合、ピクセルごとのカーネル重みの寄与を49から14に削減できます。










