0

マスク内の最も近いピクセルまでの距離に基づいてグレースケール グラデーションを作成するアルゴリズムがあります。半径が大きくなる円を作成し、マスク内のすべてのピクセルを円のピクセルに対してサンプリングすることで、ピクセルを見つけます。

for (x = 0; x < width; x++){ 
   for (y = 0; y < height; y++) {
      bool pixelFound = false;
      for (radius = 0; radius < resolution, pixelFound == false; radius++) {
         for (alpha = 0; alpha < 2 * PI; alpha += 1/radius) {
            xx = x + cos(alpha)*radius;
            yy = y + sin(alpha)*radius;

            if ( MaskHasPixel(xx, yy) ) {
               pixelFound = true;
               gradient = 1 - Magnitude(xx-x, yy-y) / resolution;
               WriteGradientForPixel(x,y, gradient);
            }
         }
      }
   }
}

現在、アルゴリズムは信じられないほど遅いです - 512x512 の画像と 128x128 のマスク サイズの場合、512*512*384*41 = 4 127 195 136 回の比較を行う必要があり、CPU での計算に膨大な時間がかかります。オプションの 1 つは、GPU で計算を行うことですが、このアルゴリズムを最適化して、はるかに高速に動作させることは可能ですか? 最終的には、滑らかなグラデーションを比較的速く取得したいと考えています。

ありがとう!

4

2 に答える 2

1

さて、その後の膨張について。それらは、修正されたアルゴリズムで実行できます。背景がゼロのマスクとしていくつかのマスクがあるとします。それを画像に配置します (ゼロの背景を拡大することにより、このステージの画像はサイズの配列unsigned shortまたはunsigned intサイズに依存する場合があります。距離のピクセル値を入力する必要があります)。

次の操作は距離計算です。より迅速に行うには、まずマスクの境界線を見つけて、座標の配列に保存します。その後、その配列を調べて、8 接続されたゼロ以外のピクセルを 1 で塗りつぶし、同時に境界線の新しい配列を塗りつぶします。

最初の反復の最後に、最初free()の境界配列と新しい配列で 2 番目の反復を実行し、2 を隣人に置き、次の境界配列を埋めます。

最後のボーダー配列のメンバーが 0 になるまで反復を繰り返します。


別のバリアントは、あなたのような直接アルゴリズムです。マスクの境界を計算して保存します。わかった。次に、拡張された画像サイズのマスクのすべてのピクセルのスキャンを開始します。

ピクセル値 ==0 の場合、境界のすべてのピクセルを調べて、それらまでの距離をカウントし、最小距離を保存します。グラデーションの値になります。

このアルゴリズムは、ポイントの側面からの境界線のピクセルまでの距離のみを計算することで改善できます。そのためには、境界ピクセルの座標だけでなく、マスクの重心からの角度も保存する必要があります。次に、境界をスキャンするときに、現在の画像ポイントからの角度と等しい角度を持つピクセルを破棄し、重心 ± 何らかの値 (π/2?) をマスクします。

計算を高速化するもう 1 つの方法は、正弦波と余弦波をいくつかのステップで集計することです。非常に小さいため、隣接メンバー間の値は無視できます。このステップは、その中心からの画像角度の角度ピクセル サイズである可能性があります。またはさらに大きい。


もちろん、この問題には他にもさまざまな最適化方法があり、そのうちのいくつかははるかに高速になるでしょう。捜査についての質問です。

于 2013-02-13T18:51:48.657 に答える
0

アルゴリズムを 3 倍高速化する方法を見つけました。 1. ボーダー マスクの幾何学的中心を計算します。2. 現在のピクセルから上記の中心までの方向を計算します。4. ある場合、検索は終了です。5. 中心に向かって境界ピクセルが見つからない場合は、元の遅い方法を使用します。

これを高速化するもう 1 つの方法は、元の画像のサイズを小さくすることです。これは大いに役立ちます。

于 2013-02-18T16:09:48.610 に答える