Оптимизация проверки цветового диапазона с помощью вложенного цикла - PullRequest
1 голос
/ 10 февраля 2012

Я знаю, что это уже некоторые вопросы "оптимизации для цикла", но я думаю, что этот вопрос немного отличается.

Я получил код, который читает все пиксели изображения.Из каждого пикселя у меня должны быть цвета 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» - это голландское слово, оно означает «количество» на английском языке.

Есть ли способ сделать этот код быстрее (для программы)?Я много чего пробовал, но не получилось.

Я тоже уже пытался сделать что-то вроде:

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

Так что, когда cRed уже выше, чем cGreenон может пропустить остальное.Тогда это будет быстрее, но далеко не достаточно быстро.

Итак, это «умный» способ ускорить выполнение этого кода?Или другой тип проверки цвета, который намного быстрее, или другой тип «фильтра».Надеюсь, что вы, ребята, можете что-то придумать.

Уже спасибо!

Редактировать: я сделал еще одну проверку пропуска, теперь программе требуется 4 секунды для проверки каждого пикселя вместо 6, но она имеетчтобы быть несколько пикселей, в течение 1 сек.

1 Ответ

2 голосов
/ 20 февраля 2012

Я нашел исправление, однако это полное изменение кода.

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

Надеюсь, это поможет и другим людям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...