2017-05-12 2 views
0

一般的に、トラバーサルオフセットをより効率的に実装して使用するにはどうすればよいですか?(ビットマップ)を通るトラバースは、よりエレガントに実装できますか?

ビットマップが以下に定義されているとします。どのようにして、固定ピクセルから始まるすべての近隣のピクセルをトラバース(この場合は収集)できますか?そして、最終的にこれらの8つのif文を避けますか?

// The bitmap 1920x1080px 
RGBColor[][] imageMatrix = new RGBColor[1920][1080]; 

// Collect all nearby pixels that are not white 
ArrayList<RGBColor> neighboringPixels = new ArrayList<RGBColor>(); 

// Width-index of center pixel 
int w = 50; 
// Height-index of center pixel 
int h = 50; 

// Initializing offsets for a more elegant check-up... 
int[][] offsets = { { -1, -1 }, { 0, -1 }, { 1, -1 }, 
     { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 }, 
     { -1, 0 } }; 

// But this is what I came up with 
// Get top-left pixel 
if (!(w - 1 < 0 || w - 1 > 255 || h - 1 < 0 || h - 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w - 1][h - 1]); 
} 
// Get top pixel 
if (!(w < 0 || w > 255 || h - 1 < 0 || h - 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w][h - 1]); 
} 
// Get top-right pixel 
if (!(w + 1 < 0 || w + 1 > 255 || h - 1 < 0 || h - 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w + 1][h - 1]); 
} 
// Get right pixel 
if (!(w + 1 < 0 || w + 1 > 255 || h < 0 || h > 255)) { 
    neighboringPixels.add(imageMatrix[w + 1][h]); 
} 
// Get bottom-right pixel 
if (!(w + 1 < 0 || w + 1 > 255 || h + 1 < 0 || h + 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w + 1][h + 1]); 
} 
// Get bottom pixel 
if (!(w < 0 || w > 255 || h + 1 < 0 || h + 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w][h + 1]); 
} 
// Get bottom-left pixel 
if (!(w - 1 < 0 || w - 1 > 255 || h + 1 < 0 || h + 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w - 1][h + 1]); 
} 
// Get left pixel 
if (!(w - 1 < 0 || w - 1 > 255 || h < 0 || h > 255)) { 
    neighboringPixels.add(imageMatrix[w - 1][h]); 
} 
+0

は「効率的」と定義されていますか?速度やコード行を意味しますか? –

+0

@Lashane私は主に単なるコード行を意味します。私たちが3次元の部屋で働かなければならない場合、それらのif文またはif文を避ける方法が必要です。 – JAR

答えて

-1

あなたは3x3の広場に反復されています

for (int i=w-1; i<w+2; ++i) { 
    if (i<0 || i>=255) continue; 
    for (int j=h-1; j<h+3; ++j) { 
     if (j<0 || j>=255) continue; 
     if (i==w && j==h) continue; 
     neighboringPixels.add(imageMatrix[i][j]); 
    } 

をすることができますような単純なコードを書くと、コンパイラは最適化を行いましょう。単に

+1

は、それが(私は== 0 && jは== 0)が続く場合だけ '変更、ほぼ正しいコードである 'あなたが正しい@Lashane' 0 ' –

+0

の代わり/ H wを使用します。 – JAR

-1

for (int i = -1 ; i <= 1 ; i++) { 
    int wi = w + i; 
    if (wi >= 0 && wi <= 255) { 
     for (int j = -1 ; j <= 1 ; j++) { 
      int hj = h + j; 
      if (!(i == 0 && j == 0) && hj >= 0 && hj <= 255) { 
       neighboringPixels.add(imageMatrix[wj][hj]); 
      } 
     } 
    } 
} 
0

あなたは、現在のコードは、最悪の場合には32個の条件が含まれています。

コードの行の点で

多かれ少なかれ最小溶液私が来るが、このようなものである:

final int minH = Math.max(0, h - 1); 
final int maxH = Math.min(255, h + 1); 
final int minW = Math.max(0, w - 1); 
final int maxW = Math.min(255, w + 1); 

for (int i = minH; i <= maxH; i++) 
    for (int j = minW; j <= maxW; j++) 
     if ((i != h) || (j != w)) 
      neighboringPixels.add(imageMatrix[i][j]); 

最悪の場合* 4 4 + 4×2 = 36の条件が存在することになります。実行時間の点で

最小溶液は、このようになります

final int prevH = h - 1; 
final int minW = Math.max(0, w - 1); 
final int nextH = h + 1; 
final int maxW = Math.min(255, w + 1); 

if ((prevH >= 0) && (prevH <= 255)) 
    for (int i = minW; i <= maxW; i++) 
     neighboringPixels.add(imageMatrix[prevH][i]); 
if ((h >= 0) && (h <= 255)) { 
    if ((minW != w) && (minW <= 255)) 
     neighboringPixels.add(imageMatrix[h][minW]); 
    if ((maxW != w) && (maxW >= 0)) 
     neighboringPixels.add(imageMatrix[h][maxW]); 
} 
if ((nextH >= 0) && (nextH <= 255)) 
    for (int i = minW; i <= maxW; i++) 
     neighboringPixels.add(imageMatrix[nextH][i]); 

最悪のケース2 + 2 + 4 + 6 + 2 + 4 = 20個の条件

にさらに最適化:

条件if ((a>=0) && (a<=255))if ((a&~0xff) != 0)に最適化できますが、[0-255]範囲

関連する問題