Cv2.GaussianBlur の使い方【OpenCV/C#(OpenCvSharp)】〜ガウシアンぼかしで画像を平滑化する〜

OpenCV for C#
📌 準備: OpenCV の環境構築がまだの方はこちら → C++ 環境構築ガイド / C#(OpenCvSharp)セットアップ

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仕様書・サンプルコード

タイトルとURLをコピーしました