0

次のように、各ピクセルに 3x3 フィルターを適用するために、3 次元配列 (各ピクセルに 3 つの値を持つ画像) を反復処理しています。

//For each value on the image    
for (i=0;i<3*width*height;i++){
    //For each filter value
    for (j=0;j<9;j++){
        if (notOutsideEdgesCondition){
            *(**(outArray)+i)+= *(**(pixelArray)+i-1+(j%3)) * (*(filter+j));
        } 
    }
}

ポインター演算を使用しているのは、配列表記を使用すると 4 つのループがあり、ループの数をできるだけ少なくしようとしているからです。私の問題は、notOutsideEdgesCondition8つの境界ケースを考慮する必要があるため、かなり手に負えなくなっていることです. 私は次の処理条件を持っています

  • 左の列:((i%width)==0) && (j%3==0)
  • 右の列:((i-1)%width ==0) && (i>1) && (j%3==2)
  • 上段:(i<width) && (j<2)
  • 下段: (i>(width*height-width)) && (j>5)

式が長くなる 4 つのコーナー ケースを考慮する必要があります。この時点で、私は立ち止まって、これが最善の方法であるかどうかを自問しました.5行の条件付き評価がある場合、デバッグが本当に面倒であるだけでなく、内部ループが遅くなるからです. そのため、このケースを処理する既知のアルゴリズムがあるかどうか、または私の問題に対するより良いアプローチがあるかどうかを尋ねに来ました. どうもありがとう。

4

2 に答える 2

0

はい、もっと良い方法があります。境界の問題がないことが保証されているケースを処理する高速ループを記述します。これは、2 番目から最後から 2 列目までの領域と、2 番目から最後から 2 番目の行の領域で構成されます。次に、各辺 (行 0、列 0、行 N、および列 N) を処理する 4 つのルーチンを作成し、最後の 4 つのポイントを手動でコーディングできます。

そうは言っても、あなたが行っているアドレス計算を行うためのはるかに高速な方法もあります。

于 2010-05-31T06:50:06.367 に答える
-1

良いヒントは、配列の一番上に行を追加し、最後に別の行を追加することです (列についても同じことを行います)。

これらの追加の行/列には情報は含まれませんが、計算が容易になります (ボーダーケースはありません)。より多くのメモリを消費する代償として...

ただのアイデア:)

于 2010-05-31T06:49:11.830 に答える