Cv2.Blur の使い方【OpenCV/C#(OpenCvSharp)】〜平均化フィルタでノイズを除去する〜

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

Cv2.Blur の使い方【OpenCV/C#(OpenCvSharp)】〜平均化フィルタでノイズを除去する〜

Cv2.Blur は、指定したカーネルサイズの範囲内の画素値を単純平均し、画像を平滑化する関数です。ノイズ除去や画像の前処理として最もシンプルかつ高速な手法の一つで、数行で実装できます。

Cv2.Blur(src, dst, new Size(5, 5));

動作環境

  • 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("画像を読み込めませんでした");

// 出力先 Mat を用意する
using var dst = new Mat();

// 5×5 の平均化フィルタを適用する
Cv2.Blur(src, dst, new Size(5, 5));

// 結果を保存する
Cv2.ImWrite("output_blur.jpg", dst);

Console.WriteLine("完了: output_blur.jpg に保存しました");

実行すると、カレントディレクトリに output_blur.jpg が生成されます。

完了: output_blur.jpg に保存しました

コードのポイント

行 解説
Cv2.ImRead(...) カラー画像として読み込む。グレースケール画像にもそのまま使える
new Size(5, 5) カーネルサイズ。値が大きいほど強くぼかされる。奇数でなくてもよい
Cv2.Blur(src, dst, ...) src を変更せず dst に結果を書き込む
using var Mat のネイティブメモリを確実に解放するための必須イディオム

引数と戻り値

Cv2.Blur(Mat src, Mat dst, Size ksize, Point? anchor = null, BorderTypes borderType = BorderTypes.Reflect101)
引数 型 説明
src Mat 入力画像(チャンネル数・深度は問わない)
dst Mat 出力画像(src と同じサイズ・深度になる)
ksize Size カーネルサイズ(幅・高さ)。大きいほど強くぼかされる
anchor Point? アンカー位置。null(= Point(-1,-1))でカーネル中心
borderType BorderTypes 画像端のパディング方法。通常はデフォルトで問題ない

戻り値は void。結果は dst に書き込まれます。

ksize の目安

ksize 効果のイメージ
(3, 3) 軽微なスムージング
(5, 5) 標準的なノイズ除去
(15, 15) 強いぼかし。テクスチャがほぼ消える

実践例

① 部分領域(ROI)だけにフィルタを適用する

画像全体ではなく特定の矩形領域のみをぼかしたい場合は、Mat ROI と組み合わせます。

using OpenCvSharp;

using var src = Cv2.ImRead("input.jpg", ImreadModes.Color);
if (src.Empty()) throw new Exception("画像を読み込めませんでした");

// ぼかしたい矩形領域を定義する
var roi = new Rect(100, 100, 200, 150);

// ROI を参照する(コピーではなくビュー)
using var roiMat = new Mat(src, roi);

// ROI 部分だけにフィルタを適用する(src 自体が書き換わる)
using var blurred = new Mat();
Cv2.Blur(roiMat, blurred, new Size(15, 15));
blurred.CopyTo(roiMat);

Cv2.ImWrite("output_roi_blur.jpg", src);
Console.WriteLine("完了: output_roi_blur.jpg に保存しました");

ROI の扱い方については Mat ROI の使い方【OpenCV/C#(OpenCvSharp)】〜画像の一部領域を切り出す〜 も参照してください。


② カーネルサイズを変えて複数出力を比較する

using OpenCvSharp;

using var src = Cv2.ImRead("input.jpg", ImreadModes.Color);
if (src.Empty()) throw new Exception("画像を読み込めませんでした");

int[] kernelSizes = { 3, 9, 21 };

foreach (var k in kernelSizes)
{
    using var dst = new Mat();
    Cv2.Blur(src, dst, new Size(k, k));
    string filename = $"blur_k{k}.jpg";
    Cv2.ImWrite(filename, dst);
    Console.WriteLine($"保存: {filename}");
}

実行すると3枚の JPEG が生成されます。

保存: blur_k3.jpg
保存: blur_k9.jpg
保存: blur_k21.jpg

画像を見比べることで、カーネルサイズと平滑化の強度の関係を直感的に確認できます。ファイル保存の詳細は Cv2.ImWrite の使い方【OpenCV/C#】〜画像をファイルに保存する〜 を参照してください。


つまずきポイント

⚠️ Mat の using を忘れるとメモリリークする

Mat はネイティブ(C++)側のメモリを確保します。C# の GC は回収のタイミングを保証しないため、using var で明示的に Dispose() を呼ぶことが必須です。ループ内で大量の Mat を生成するコードでは特に注意してください。

// NG: GC 任せ
var dst = new Mat();

// OK: using で確実に解放
using var dst = new Mat();

⚠️ DllNotFoundException: OpenCvSharpExtern が出る

NuGet で OpenCvSharp4 だけを入れて OpenCvSharp4.runtime.win を入れていない場合に発生します。Windows 環境では必ずセットで追加してください。

dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.runtime.win

✅ Cv2.Blur と cv::blur の引数の対応

C++ では anchor に cv::Point(-1, -1) を渡しますが、OpenCvSharp では省略または null を渡せます。C++ のドキュメントを参照しながら実装する場合、デフォルト引数の扱いが異なる点に注意してください。


関連する関数

平均化フィルタの隣接手法も合わせて確認しておくと、用途に応じた使い分けができます。

  • Cv2.GaussianBlur — ガウス分布で重み付けした平滑化。エッジをより自然に保つ
  • Cv2.MedianBlur — 中央値を使った平滑化。ゴマ塩ノイズに強い
  • Cv2.BilateralFilter — エッジを保持しながら平滑化。処理は重め

いずれも imgproc モジュールに含まれており、Cv2.Blur と同様のインターフェースで使えます。


まとめ

Cv2.Blur は最小限のコードで平均化フィルタを適用できる、画像前処理の基本関数です。カーネルサイズで平滑化の強度を直感的に制御でき、ROI と組み合わせることで部分的な処理も簡単に実現できます。using による Mat の確実な解放だけ忘れずに、まずは動かしてみてください。

🛠 画像処理のプロが開発するSDK/API

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

→ 顔認証のなりすまし対策 設計チェックリスト(当ブログ)
→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

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