Cv2.GaussianBlur の使い方【OpenCV/C#(OpenCvSharp)】〜ガウシアンぼかしで画像を平滑化する〜
Cv2.GaussianBlur は画像にガウシアンフィルタを適用して平滑化(ぼかし)を行う関数です。ノイズ除去・エッジ検出の前処理・背景ぼかしなど、画像処理パイプラインの基礎として頻繁に登場します。最小構成は次の1行です。
Cv2.GaussianBlur(src, dst, new Size(15, 15), 0);
動作環境
- OpenCV 4.x 系(OpenCvSharp4)
- .NET 8 コンソールアプリ
- NuGet:
OpenCvSharp4+OpenCvSharp4.runtime.win(Windows 実行時)
環境構築がまだの方は環境構築ガイドを先にどうぞ。
基本の使い方
まずシンプルなサンプルで動作を確認します。
using OpenCvSharp;
// 入力画像を読み込む
using var src = Cv2.ImRead("input.jpg", ImreadModes.Color);
if (src.Empty()) throw new Exception("画像の読み込みに失敗しました");
// ガウシアンぼかしを適用(カーネルサイズ 15x15、シグマ自動計算)
using var dst = new Mat();
Cv2.GaussianBlur(src, dst, new Size(15, 15), 0);
// 結果を保存
Cv2.ImWrite("output.jpg", dst);
Console.WriteLine("ガウシアンぼかしを適用して output.jpg に保存しました");
実行すると、コンソールに次のように表示され、ぼかしが適用された画像が保存されます。
ガウシアンぼかしを適用して output.jpg に保存しました
コードのポイント解説
src・dstはどちらもusingで確実に解放しています。new Size(15, 15)がカーネルサイズです。奇数でなければならず、大きいほどぼかしが強くなります。- 第4引数
sigmaX = 0を指定すると、カーネルサイズからシグマが自動計算されます。実用上はこれで問題ありません。
引数と戻り値
| 引数 | 型 | 説明 |
|---|---|---|
src |
Mat |
入力画像(任意チャンネル) |
dst |
Mat |
出力画像(src と同サイズ・同型) |
ksize |
Size |
ガウシアンカーネルのサイズ。縦横ともに正の奇数を指定する |
sigmaX |
double |
X 方向のガウシアン標準偏差。0 でカーネルサイズから自動計算 |
sigmaY |
double |
Y 方向の標準偏差(省略可)。0 または省略で sigmaX と同値 |
borderType |
BorderTypes |
境界処理の種類(省略可。デフォルト: BorderTypes.Default) |
戻り値はありません(結果は dst に書き込まれます)。
実践例
ノイズ除去してからエッジ検出する
ガウシアンぼかしの最も代表的な用途は、Canny などのエッジ検出前のノイズ抑制です。
using OpenCvSharp;
using var src = Cv2.ImRead("input.jpg", ImreadModes.Grayscale);
if (src.Empty()) throw new Exception("画像の読み込みに失敗しました");
// ノイズ除去(軽めのぼかし)
using var blurred = new Mat();
Cv2.GaussianBlur(src, blurred, new Size(5, 5), 0);
// Canny エッジ検出
using var edges = new Mat();
Cv2.Canny(blurred, edges, 50, 150);
Cv2.ImWrite("edges.jpg", edges);
Console.WriteLine("エッジ検出結果を edges.jpg に保存しました");
カーネルサイズ 5x5 は「軽めのノイズ除去」に適した定番値です。
画像の一部だけにぼかしを適用する
ROI(Region of Interest)を使うと、画像の特定領域だけをぼかせます。顔・ナンバープレートなど個人情報の匿名化処理でよく使うパターンです。
using OpenCvSharp;
using var src = Cv2.ImRead("input.jpg", ImreadModes.Color);
if (src.Empty()) throw new Exception("画像の読み込みに失敗しました");
// ぼかしを適用したい矩形領域を指定
var roi = new Rect(100, 80, 200, 150);
// ROI を切り出して Mat として扱う(Dispose 不要: src のビューのため)
using var roiMat = new Mat(src, roi);
// ROI にインプレースでぼかしを適用
Cv2.GaussianBlur(roiMat, roiMat, new Size(51, 51), 0);
Cv2.ImWrite("output_roi.jpg", src);
Console.WriteLine("一部領域にぼかしを適用して output_roi.jpg に保存しました");
ROI の使い方について詳しくは Mat ROI の使い方【OpenCV/C#(OpenCvSharp)】 を参照してください。
シグマを明示してぼかし量を細かく制御する
カーネルサイズを固定しつつシグマで強度を調整したい場合は、sigmaX を明示します。
using OpenCvSharp;
using var src = Cv2.ImRead("input.jpg", ImreadModes.Color);
if (src.Empty()) throw new Exception("画像の読み込みに失敗しました");
// sigmaX = 2.0 で適度なぼかし
using var dst1 = new Mat();
Cv2.GaussianBlur(src, dst1, new Size(9, 9), 2.0);
Cv2.ImWrite("blur_sigma2.jpg", dst1);
// sigmaX = 8.0 で強めのぼかし
using var dst2 = new Mat();
Cv2.GaussianBlur(src, dst2, new Size(9, 9), 8.0);
Cv2.ImWrite("blur_sigma8.jpg", dst2);
Console.WriteLine("シグマ違いの2パターンを保存しました");
カーネルサイズが同じでもシグマを変えると出力が変わります。sigmaX = 0 の自動計算で十分なケースがほとんどですが、強度を段階的に変えたい場合はシグマを使います。
ぼかした結果を画像ファイルに保存する方法は Cv2.ImWrite の使い方【OpenCV/C#】 に詳しくまとめています。
つまずきポイント
⚠️ カーネルサイズに偶数を指定するとクラッシュする
GaussianBlur のカーネルサイズは 奇数 である必要があります。new Size(10, 10) のように偶数を指定すると、実行時に OpenCVException が発生します。7, 9, 11, 15 など奇数を選んでください。
// NG: 偶数はクラッシュ
Cv2.GaussianBlur(src, dst, new Size(10, 10), 0);
// OK: 奇数を指定する
Cv2.GaussianBlur(src, dst, new Size(11, 11), 0);
⚠️ src と dst に同じ Mat を渡してはいけない
Cv2.GaussianBlur(src, src, ...) のようにインプレースで同一 Mat を入出力に指定するのは一般的に非推奨です(内部バッファの上書き競合が起きる可能性があります)。別の Mat を用意してください。ただし、上記の ROI を使ったサンプルは ROI Mat が元画像とメモリを共有するため、ROI Mat を dst に使うのは問題ありません。
⚠️ Mat の Dispose 漏れに注意
new Mat() で生成した dst は using で囲まなければネイティブメモリが解放されません。本記事のサンプルはすべて using を使っていますが、ループ内でぼかしを繰り返す場合はとくに注意してください。Dispose 漏れは GC で即時回収されないため、長時間動作するアプリで致命的なメモリリークになります。
関連する関数
- Cv2.Blur — 単純平均フィルタ。GaussianBlur より高速だが品質はやや劣る
- Cv2.MedianBlur — ごま塩ノイズに強いメディアンフィルタ
- Cv2.BilateralFilter — エッジを保ちながらぼかすバイラテラルフィルタ。GaussianBlur より処理が重い
- Cv2.Canny — エッジ検出。GaussianBlur と組み合わせるのが定番
- Cv2.CvtColor の使い方【OpenCV/C#】 — グレースケール変換。ぼかし前のグレースケール変換としてセットで使うことが多い
まとめ
Cv2.GaussianBlur はカーネルサイズを奇数で指定するだけで手軽にぼかしを適用できます。sigmaX = 0 の自動計算で実用的な結果が得られるため、まずはカーネルサイズだけを調整しましょう。ROI と組み合わせれば部分的な匿名化処理にも応用できます。
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。
→ 顔認証のなりすまし対策 設計チェックリスト(当ブログ)
→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

