1

ぼやけた画像を返すために計算されたガウス カーネルを実装する能力に苦労しています。カーネルを計算する現在のコードは次のとおりです。

const int m = 5;
const int n = 5;
double sigma = std;
Mat Gauss;
double kernel[m][n];
for ( int x = 0; x < m; ++x )
    for ( int y = 0; y < n; ++y )
    {
        kernel[x][y] = (1 / (sigma * (sqrt(2 * M_PI))))
            * exp(-0.5 * (std::pow((x - avg) / sigma, 2.0)
                + pow((y - avg) / sigma, 2.0) ) / (2 * M_PI * sigma * sigma));
    }

ただし、ぼやけた画像が返されるように、これを画像に適用する方法がわかりません。これを画像に適用できる方法で誰かが私にいくつかの指針を与えることができれば幸いです.

for ループを使用して元の画像のピクセルを置き換えることを考えていましたが、このアイデアを適切に実装できませんでした。お時間をいただきありがとうございます。

4

1 に答える 1

1

次のように、ガウス カーネルを使用して元の画像の畳み込みを計算したいようです。

ぼかし[x][y] = 積分 (カーネル[s][t] * 元の[xs][yt]) ds dt

そのためのテクニックがいくつかあります。

  1. 直接畳み込み: グリッドを通過し、各点で上記の積分を計算します。これは、サポートが非常に小さいカーネル (各方向に 5 グリッド ポイント程度) ではうまく機能しますが、サポートが大きいカーネルでは遅くなりすぎます。ガウス カーネルの場合、トランケート サポートの経験則は約 3*シグマであるため、2 グリッド ポイント以下でシグマを使用して直接畳み込みを行うことは不合理ではありません。

  2. 高速フーリエ変換 (FFT)。これは、どのカーネルでもかなり高速に動作します。したがって、FFT は、ほぼすべてのものとほぼすべてのものとの畳み込みを計算する標準的な方法になりました。直接畳み込みは、サポートが非常に少ないカーネルでのみ FFT を打ち負かします。

  3. Analytical: 一部のカーネルの積分には、解析的な式があります。特に、Gaussian の積分は Erf 関数であり、少なくとも Unix システムでは、関数呼び出しとして利用できます。さらに、一部のハードウェア (GPU など) では、Erf がハードウェアに実装されています。まれな (しかし重要な) 粗い 2 値画像のケースでは、たたみ込みを Gaussian に置き換えて、Erf 関数呼び出しのループを使用できます。

ほとんどの計算システムでは、FFT を使用するのが最善の策です。FFT は高速であり、カーネルと画像を正しく処理するのに十分な柔軟性があります。

于 2013-09-11T17:19:18.180 に答える