2012-02-10 13 views
1

すでに「最適化ループ」の質問がありますが、これは少し違うと思います。ネストされたforループでカラー範囲チェックを最適化する

画像からすべてのピクセルを読み取るコードがあります。 各ピクセルから、RGBカラーが必要ですが、これもすでに動作しています。 次に、緑の色が赤色の青色よりも大きいかどうかを確認する必要があります。これも機能します。 緑色が大きく、赤色と青色のときは、何かをしなければなりません。 これはすべて動作しますが、現時点では実際には遅いです。

、それが原因で、それはチェックの何百万人を行う必要があり、ネストされたループで、遅いですなぜ私はまた、これは私のコードです 、知っている:

for (int j = 0; j < 200; j++){ 
      for (int k = 0; k < 200; k++){ 
       Log.i("Pixel Value", "pixel x="+j +k + Integer.toHexString(bmp.getPixel(j, k))); 

        for (cGreen = 50; cGreen < 254; cGreen++){ 
         for (cRed = 0; cRed < 254; cRed++){ 
          for (cBlue = 0; cBlue < 254; cBlue++){ 

           if (Color.rgb(cRed, cGreen, cBlue) == bmp.getPixel(j, k)){ // magic method 
            if ((cGreen > cRed)&&(cGreen > cBlue)){ 
             // this pixel is some sort of green 
             aantal++; 
            } 
           } 
          } 
         } 
        } 
      } 
     } 

J & k個の変数は、画像の大きさです。 「aantal」は英語で「金額」を意味します。

このコードを(プログラム用に)高速化する方法はありますか? 私はたくさんのことを試みましたが、うまくいきませんでした。 CREDがcGreenその後、すでに高い場合

if (cGreen < cRed){ 
    // skip the rest 
} 

だから、彼は残りの部分をスキップすることができます。

は、私はまたのようなチェック何かをすでに試みました。 それより速いが、十分に速くはるかに離れている。

だから、このコードをより速く実行するための "スマートな"方法ですか? 他のタイプのカラーチェック、または他のタイプの「フィルタ」。 皆さんは何かを考えてくれることを願っています。

既にありがとうございます!

編集: 私はもう一度スキップチェックを行いました。プログラムは6ピクセルではなく、チェックするピクセルごとに4秒かかっていますが、1秒以内に数ピクセルでなければなりません。

+0

私はそれをすでに修正しましたが、自分の回答を投稿することはできません。私の担当者は十分に高いのではありませんが、それはいつですか? – Bigflow

答えて

1

修正が見つかりましたが、コードは完全に変更されました。

bmp = BitmapFactory.decodeResource(getResources(), 
       R.drawable.four_colors); 
     System.out.println("START"); 
     int orgWidth = bmp.getWidth(); 
     int orgHeight = bmp.getHeight(); 
     //define the array size 
     int[] pixels = new int[orgWidth * orgHeight]; 

       bmp.getPixels(pixels, 0, orgWidth, 0, 0, orgWidth, orgHeight); 

       for (int y = 0; y < orgHeight; y++){ 
        for (int x = 0; x < orgWidth; x++){ 
         int index = y * orgWidth + x; 
         int R = (pixels[index] >> 16) & 0xff;  //bitwise shifting 
         int G = (pixels[index] >> 8) & 0xff; 
         int B = pixels[index] & 0xff; 
         total++; 
         if ((G > R)&&(G > B)){ 
          counter++; 
          // do something 
         } 
        } 
       } 

他の人にも役立つことを願っています。

関連する問題