4

学校のプロジェクトでガウスぼかしを実装しようとしています。パフォーマンスを比較するには、CPU と GPU の両方の実装を作成する必要があります。

ガウスぼかしがどのように機能するかを理解しているかどうかはよくわかりません。私の質問の 1 つは、正しく理解できているかどうかです。

私が今やっていることは次のとおりです。ウィキペディアhttp://en.wikipedia.org/wiki/Gaussian_blurの式を使用してフィルターを計算します。2d の場合、画像内の各ピクセルの RGB を取得し、ピクセルと周囲のピクセルの RGB に関連するフィルター位置を乗算してフィルターを適用します。次に、これらが合計されて、新しいピクセル RGB 値になります。1d の場合、フィルターを最初に水平方向に適用し、次に垂直方向に適用します。物事を正しく理解していれば、同じ結果が得られるはずです。この結果は、2d フィルターを適用した場合とまったく同じ結果ですか?

もう 1 つの質問は、アルゴリズムを最適化する方法についてです。高速フーリエ変換がガウスぼかしに適用できることを読みました。しかし、私はそれを関連付ける方法がわかりません。誰かが正しい方向へのヒントを教えてくれますか?

ありがとう。

4

1 に答える 1

8

はい、2D Gaussian カーネルは分離可能であるため、2 つの 1D カーネルとして適用できます。ただし、これらの操作を「その場で」適用することはできないことに注意してください。最初の 1D パスの結果を格納するには、少なくとも 1 つの一時バッファーが必要です。

FFT ベースの畳み込みは、カーネルが大きい場合に便利な最適化です。これは、ガウスだけでなく、あらゆる種類のフィルターに適用されます。「大きい」がどれだけ大きいかはアーキテクチャによって異なりますが、たとえば 49x49 カーネルよりも小さいものに FFT ベースのアプローチを使用することについて心配する必要はないでしょう。一般的なアプローチは次のとおりです。

  • 画像をFFTする
  • カーネルを FFT し、画像のサイズに合わせてパディングします
  • 周波数領域で 2 つを乗算します (空間領域での畳み込みに相当)。
  • IFFT(逆FFT)結果

同じフィルターを複数の画像に適用する場合、パディングされたカーネルを FFT する必要があるのは 1 回だけであることに注意してください。ただし、画像ごとに少なくとも 2 つの FFT を実行する必要があります (1 つの順方向と 1 つの逆方向)。これが、この手法が大規模なカーネルの計算上の勝利になる理由です。

于 2011-10-14T09:02:45.410 に答える