5

9x9のラプラシアンオブガウスフィルターを使用したプレフィルターステージを含むビジョンアルゴリズムを実装しようとしています。高速フィルターの実装を簡単に説明しているドキュメントを指摘できますか?最も効率的なフィルタリングにはFFTを利用する必要があると思います。

4

3 に答える 3

10

本当に FFT を使用しますか? これは配列全体の変換になり、コストがかかります。9x9 畳み込みフィルターを既に決定している場合は、FFT は必要ありません。

一般に、C で畳み込みを行う最も安価な方法は、ポインターを配列上に移動し、各点で畳み込み値を合計し、データを新しい配列に書き込むループを設定することです。このループは、好みの方法 (コンパイラーのベクトル化、MPI ライブラリー、OpenMP など) を使用して並列化できます。

境界について:

  • 境界の外側の値が 0 であると想定する場合は、2 次元の点配列に 0 の 4 要素境界線を追加します。これにより、高価な境界を処理するための if ステートメントが不要になります。
  • データが境界で折り返される場合 (つまり、周期的である場合)、モジュロを使用するか、グリッドの反対側をコピーする 4 つの要素の境界線を追加します (abcdefg -> fgabcdefgab で 2 ポイント)。**注: これは、FFT を含むあらゆる種類のフーリエ変換で暗黙的に想定していることです**。そうでない場合は、FFT を実行する前に考慮する必要があります。

4 ポイントは、9x9 カーネルの最大境界オーバーラップがメイン グリッドの外側の 4 ポイントであるためです。したがって、2n+1 x 2n+1 カーネルには n ポイントの境界が必要です。

この畳み込みを非常に高速にする必要がある場合、および/またはグリッドが大きい場合は、プロセッサのキャッシュに保持できる小さな断片に分割することを検討してください。これにより、計算がはるかに高速になります。これは、実行したい GPU オフロードにも当てはまります (このタイプの浮動小数点計算には理想的です)。

于 2009-03-24T09:55:20.980 に答える
2

実際には、画像全体を保持するのに十分な大きさのFFTサイズを使用する必要はありません。小さなオーバーラップする2dfftsをたくさん実行できます。「高速畳み込み」「オーバーラップ保存」「オーバーラップ加算」を検索できます。

ただし、9x9カーネルの場合。スピード的にはあまりメリットがないかもしれません。

于 2009-08-13T00:36:15.520 に答える
2

ここに理論リンクがあります http://hebb.mit.edu/courses/9.29/2002/readings/c13-1.pdf

そして、これは私が過去に使用した非常に優れたFFTライブラリであるfftwへのリンクです(ライセンスをチェックして、適切であることを確認してください)http://www.fftw.org/

画像とカーネル (9x9 行列) を FFT するだけです。乗算してから逆変換します。

ただし、9x9 マトリックスを使用すると、実際の座標で実行した方がよい場合があります (画像ピクセルとマトリックスを 2 回ループするだけです)。両方の方法を試してください!

于 2009-03-24T09:52:32.203 に答える