C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でガウスフィルターを生成する方法【5×5カーネルの実装例】

ガウスフィルターとは

ガウスフィルターは、画像処理の分野で最もよく使われるフィルターの一つです。画像に含まれるノイズを低減したり、画像を滑らかにぼかす(スムージング)ために利用されます。本記事では、C++を使って2次元ガウスカーネル(フィルター係数)を生成する方法を解説します。


2次元ガウス分布の数式

2次元のガウスカーネルは、以下のガウス分布の式に基づいて計算されます。

$$G(x,y)= \frac{1}{2\Pi\:\sigma^{2}}e^{-\frac{x^{2}+y^{2}}{2\sigma^{2}}}$$

ここで、x, y はカーネル中心からの距離、σ(シグマ)は分布の広がりを決める標準偏差です。σが大きいほど、ぼかし効果は強くなります。


C++による実装例

それでは、実際のコードを見てみましょう。この例では、σ = 1.0 の5×5サイズのガウスカーネルを生成します。

#include <cmath>
#include <iomanip>
#include <iostream>
#define PI 3.1415
using namespace std;

void calc_filter(double kernel[][5]) {
    double sigma = 1.0;
    double p, q = 2.0 * sigma * sigma;
    double sum = 0.0;

    // 各要素のガウス値を計算
    for (int x = -2; x <= 2; x++) {
        for (int y = -2; y <= 2; y++) {
            p = sqrt(x * x + y * y);
            kernel[x + 2][y + 2] = (exp(-(p * p) / q)) / (PI * q);
            sum += kernel[x + 2][y + 2];
        }
    }

    // 全要素の合計が1になるように正規化
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            kernel[i][j] /= sum;
}

int main() {
    double kernel[5][5];
    calc_filter(kernel);

    // カーネルの内容を表示
    for (int i = 0; i < 5; ++i) {
        for (int j = 0; j < 5; ++j)
            cout << kernel[i][j] << " ";
        cout << endl;
    }
}

コードのポイント

  • 中心基準の座標: ループ変数 x, y を −2〜2 の範囲で回すことで、カーネルの中心を原点として扱っています。
  • 正規化処理: 計算した全要素の合計で各要素を割ることで、カーネル全体の合計が1になります。これにより、フィルター適用後も画像の明るさが変わりません。

実行結果

0.00296902 0.0133062 0.0219382 0.0133062 0.00296902
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.0219382 0.0983203 0.162103 0.0983203 0.0219382
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902

出力を見ると、中心(0, 0)の値が最も大きく、中心から離れるほど値が小さくなっていることがわかります。これはガウス分布の特徴そのものであり、この対称性のある重み付けによって、自然なぼかし効果が得られるのです。


生成したカーネルは、OpenCVなどのライブラリを使わずに自前で畳み込み処理を実装する際にも活用できます。σやカーネルサイズを変更すれば、ぼかしの強さを自由に調整できるので、ぜひいろいろな値で試してみてください。

  1. Linux向けC++開発に最適なIDEのおすすめ6選

    大規模なプロジェクトをテキストエディタだけで管理するのは容易ではありません。そうしたケースではIDE(統合開発環境)を活用することで、生産性が向上し、フラストレーションも大幅に軽減されるでしょう。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。「Linux上のC++開発において唯一のベスト」と呼べるIDEは存在せず、賢くツールを見極める必要があります。ここでは、人気が高く、編集部のおすすめでもあるLinux向けIDEを紹介します。Linuxで使えるC++向けIDE おすすめ6選1. NetBeansNetBeansは、C/C++をはじめ多くのプログラミング言語に対

  2. LinuxでのC/C++開発におすすめのIDE 6選|特徴と選び方を解説

    テキストエディタだけでは大規模開発は難しい大規模なプロジェクトを単なるテキストエディタだけで管理するのは容易ではありません。そうしたケースでは、IDE(統合開発環境)を活用することで生産性が向上し、ストレスも大幅に軽減されます。IDEにはさまざまな種類があるため、自分のニーズに合ったものを選ぶことが重要です。この記事では、Linuxで利用できるC/C++向けの優れたIDEを6つご紹介します。1. NetBeans(C/C++開発向け)NetBeansは、無料かつオープンソースの人気クロスプラットフォームIDEです。C/C++をはじめ、多くのプログラミング言語に対応しており、コミュニティが開発し