cv::GaussianBlur の使い方【OpenCV/C++】〜ガウシアンぼかしで画像を平滑化する〜

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

cv::GaussianBlur の使い方【OpenCV/C++】〜ガウシアンぼかしで画像を平滑化する〜

cv::GaussianBlur は、ガウス関数を重みとしたカーネルで画像を畳み込み、ノイズ除去や平滑化を行う関数です。単純な平均ぼかしより自然な仕上がりになるため、前処理としてもっとも頻繁に使われるフィルタの一つです。

最小の呼び出しはこうなります。

cv::GaussianBlur(src, dst, cv::Size(15, 15), 0);

動作環境

項目 内容
OpenCV 4.x
言語 C++17
ビルド例 g++ -std=c++17 main.cpp \pkg-config –cflags –libs opencv4“

環境構築がまだの方は環境構築ガイドを先にどうぞ。


基本の使い方

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 画像を読み込む
    cv::Mat src = cv::imread("input.jpg");
    if (src.empty()) {
        std::cerr << "画像の読み込みに失敗しました" << std::endl;
        return -1;
    }

    cv::Mat dst;

    // カーネルサイズ 15x15、シグマは自動計算
    cv::GaussianBlur(src, dst, cv::Size(15, 15), 0);

    cv::imwrite("output.jpg", dst);
    std::cout << "保存完了: output.jpg" << std::endl;

    return 0;
}

実行すると output.jpg にぼかしを適用した画像が保存されます。元画像と比べて輪郭が柔らかくなり、細かいノイズが目立たなくなっていることが確認できます。

処理の流れ

  1. cv::imread で画像を読み込む(cv::imread の詳細はこちら
  2. cv::GaussianBlur でガウシアンフィルタを適用する
  3. cv::imwrite で結果を保存する

sigmaX0 を指定すると、ksize から sigma = 0.3 * ((ksize - 1) * 0.5 - 1) + 0.8 という OpenCV の式で自動計算されます。多くの場面ではこれで問題ありません。


引数と戻り値

void cv::GaussianBlur(
    InputArray  src,
    OutputArray dst,
    Size        ksize,
    double      sigmaX,
    double      sigmaY  = 0,
    int         borderType = BORDER_DEFAULT
)
引数 説明
src InputArray 入力画像。チャンネル数は問わないが、深度は CV_8U / CV_16U / CV_32F / CV_64F
dst OutputArray 出力画像。src と同じサイズ・型
ksize cv::Size カーネルサイズ。奇数で正の値のみ有効。(0, 0) を指定すると sigmaX から自動計算
sigmaX double X 方向のガウス分布の標準偏差。0 を渡すと ksize から自動計算
sigmaY double Y 方向のシグマ。0 のとき sigmaX と同じ値が使われる
borderType int 境界条件。通常はデフォルト (BORDER_DEFAULT) のままでよい

戻り値はなし(void)。結果は dst に格納されます。


実践例

1. ノイズ除去してからエッジ検出する

エッジ検出(Canny など)の前にガウシアンぼかしを適用するのは定番の前処理です。ぼかしなしでは微小なテクスチャもエッジとして拾われてしまいます。

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    cv::Mat src = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
    if (src.empty()) {
        std::cerr << "画像の読み込みに失敗しました" << std::endl;
        return -1;
    }

    cv::Mat blurred, edges;

    // ノイズ除去:カーネル小さめ・シグマ明示
    cv::GaussianBlur(src, blurred, cv::Size(5, 5), 1.5);

    // Canny エッジ検出
    cv::Canny(blurred, edges, 50, 150);

    cv::imwrite("edges.jpg", edges);
    std::cout << "エッジ画像を保存しました: edges.jpg" << std::endl;

    return 0;
}

sigmaX = 1.5 を明示することで、カーネルサイズが変わってもぼけ具合を固定できます。エッジ検出の前処理では ksize を 3〜7、sigmaX を 1.0〜2.0 程度から試すのが現場での目安です。


2. カーネルサイズをパラメータとして切り替える

開発中はカーネルサイズを変えながら結果を確認したい場面が多いです。ksize はループや設定ファイルから渡せるよう整数で管理しておくと便利です。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

int main()
{
    cv::Mat src = cv::imread("input.jpg");
    if (src.empty()) {
        std::cerr << "画像の読み込みに失敗しました" << std::endl;
        return -1;
    }

    // 試したいカーネルサイズ(奇数のみ)
    std::vector<int> kernelSizes = {3, 7, 15, 31};

    for (int k : kernelSizes) {
        cv::Mat dst;
        cv::GaussianBlur(src, dst, cv::Size(k, k), 0);

        std::string filename = "blur_k" + std::to_string(k) + ".jpg";
        cv::imwrite(filename, dst);
        std::cout << "保存: " << filename << std::endl;
    }

    return 0;
}

実行すると blur_k3.jpgblur_k31.jpg が生成されます。カーネルを大きくするほどぼけが強くなり、処理時間も増えます。


つまずきポイント

⚠️ カーネルサイズに偶数を渡すとクラッシュする

cv::Size(14, 14) のように偶数を渡すと、実行時に OpenCV の assertion エラーで落ちます。

OpenCV Error: Assertion failed (ksize.width > 0 && ksize.width % 2 == 1 ...)

カーネルサイズは 必ず奇数(1, 3, 5, 7, …)にしてください。外部から値を受け取る場合は、偶数になっていないか手前でチェックするか、k | 1 で奇数に丸める処理を入れておくと安全です。

int k = rawValue | 1; // 偶数でも奇数に丸める

⚠️ CV_8U 以外の深度では sigma の効き方が変わる

CV_32FCV_64F の画像に適用する際は、画素値のスケールが異なるため sigmaX = 0 による自動計算では意図したぼけ量にならないことがあります。sigmaX を明示的に指定するほうが安全です。


⚠️ ksize = (0, 0) のときは sigmaX が必須

cv::Size(0, 0) を渡した場合、sigmaX から逆算してカーネルサイズを決定します。このとき sigmaX = 0 も同時に渡すと assertion エラーになります。(0, 0) を使う場合は必ず sigmaX を正の値で指定してください。


関連する関数

関数 用途
cv::blur 単純な平均ぼかし。軽量だが端が不自然になりやすい
cv::medianBlur 中央値フィルタ。ごま塩ノイズに強い
cv::bilateralFilter エッジを保持しつつ平滑化。処理は重い

cv::blurcv::medianBlur と使い分ける基準は「ノイズの種類」です。ガウシアンノイズには GaussianBlur、ごま塩ノイズには medianBlur が定石です。

Windows 環境でビルドする際のリンク設定で迷ったときは opencv_world の使い方とリンク方法【OpenCV/C++ Windows】 も参考にしてください。


まとめ

  • cv::GaussianBlur はカーネルサイズと sigmaX を指定するだけで使えるシンプルな API。
  • カーネルサイズは奇数必須sigmaX = 0 で ksize から自動計算される。
  • エッジ検出・特徴点検出の前処理として最初に試すべき定番フィルタ。

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

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/API(C++製・OpenCV 4.10)を開発しています。顔認証システムへの組み込み実績多数。

→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

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