使用嵌套for循环优化颜色范围检查

时间:2012-02-10 09:19:54

标签: android optimization colors filter for-loop

我知道他们已经有一些“优化循环”问题了,但我认为这个问题有点不同。

我有一个代码可以读取图像中的所有像素。 从每个像素我必须有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&amp; k变量是图像的大小。 而“aantal”是一个荷兰语,在英语中意为“数量”。

他们是否可以更快地制作此代码(针对程序)? 我尝试了很多东西,但结果并不好。

我也尝试过检查:

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

因此,当cRed已经高于cGreen时,他可以跳过其余部分。 然后它更快,但远远不够快。

那么,他们是一种“智能”的方式来让这段代码更快地运行吗? 或者其他类型的颜色检查要快得多,或者是其他类型的“过滤器”。 希望你们能想到什么。

已经感谢了!

编辑: 我做了另一个跳过检查,程序现在需要4秒来检查每个像素,而不是6,但它必须是几个像素,在1秒内。

1 个答案:

答案 0 :(得分:2)

我找到了一个修复程序,然而代码是完全改变的。

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
                        }
                     }
                 }

我希望它也会帮助其他人。