1

これを実装するエレガントな方法を探しています。基本的に私はamxn行列を持っています。各セルはピクセル値を表し、行と列は画像のピクセル行とピクセル列を表します。

基本的に、対応するピクセル値とともに、HDF ファイルからポイントをマッピングしたためです。基本的に、空のピクセルがたくさんあります。0 で埋められます。

今私がする必要があるのは、周囲のセルの平均を取り、欠落しているセルのピクセル値を平均化することです。

今、私はこれを総当たりにすることができますが、それは醜い速さになります。これに対するエレガントな解決策はありますか?

4

2 に答える 2

2

このフィルタリングの問題には、よく知られた最適化があります。

  • 細胞を一方向に統合する(水平方向など)
  • 細胞を反対方向に統合する(垂直方向と言う)
  • 各セルとその左隣の N 番目のセルとの差をとります。
  • 各セルとその N 番目に低い隣接セルとの差を取る

このような:

    for (i = 0; i < h; ++i)
    for (j = 0; j < w-1; ++j)
       A[i][j+1] += A[i][j];
    for (i = 0; i < h-1; ++i)
    (j = 0; j < w; ++j) の場合
       A[i+1][j] += A[i][j]
    for (i = 0; i < h; ++i)
    for (j = 0; j < wN; ++j)
       A[i][j] -= A[i][j+N];
    for (i = 0; i < hN; ++i)
    (j = 0; j < w; ++j) の場合
       A[i][j] -= A[iN][j];

これが行うことは次のとおりです。

  • 最初のパスは、各セルを、その行の左側にあるすべてのセル (それ自体を含む) の合計にします。
  • 2 回目のパスの後、各セルは、セルの上下にある四角形内のすべてのセルの合計です (それ自体の行と列を含む)。
  • 3 回目のパスの後、各セルは、それ自体の右上にある N 列幅の長方形の合計になります。
  • 4 番目のパスの後、各セルは、それ自体の下と右にある NxN の四角形の合計になります。

これは、合計を計算するためにセルごとに 4 つの操作が必要ですが、ブルート フォースの場合は 8 回です (3x3 平均化フィルターを実行していると仮定します)。

優れた点は、通常の 2 の補数演算を使用する場合、最初の 2 つのパスでのオーバーフローを心配する必要がないことです。それらは最後の 2 つのパスで相殺されます。

于 2009-11-03T18:52:08.423 に答える
0

ここでの主な問題は、利用可能なすべてのコアとキャッシュ効率を活用することです。
畳み込みの高速な実装を確認することに興味があるかもしれません。
ただし、Boost で行うため、この Boost の例
でこれがどのように行われるかを確認でき ます。特殊なタスクの畳み込みカーネルのみを変更する必要があると思います。

于 2009-11-03T14:01:22.907 に答える