Сравните пиксель двух разных изображений, занимает слишком много времени - PullRequest
1 голос
/ 19 октября 2011

Я хочу сравнить пиксель двух разных изображений. Я сравниваю пиксель первого изображения со всеми пикселями второго изображения. Вот мой код:

for (int i = 0; i < bitmap.getWidth(); i++) {
    for (int j = 0; j < bitmap.getHeight(); j++) {

        for (int k = 0 ; k<bitmpa2.getWidth(); k++) {
            for (int l = 0 ; l<bitmpa2.getHeight(); l++) {

                if (bitmap.getPixel(i, j) == bitmap2.getPixel(k, l))
                  Counter++ ;
          }
       }
    }
}

Здесь значение Counter - это количество пикселей, одинаковых на обоих изображениях. Проблема в том, что это работает, но на это уходит много времени, поэтому проблема заключается в ограничении времени, так что же мне нужно, чтобы сократить время и получить точный результат? Любая другая возможность приветствуется.

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

О нет, помните об этом при обработке изображений в Android.

Никогда не используйте getPixel () или setPixel () непрерывно, как цикл, это будет результат действительно очень плохой, чертовски медленный. Используйте getPixels () и setPixels () вместо

Имейте в виду, что сначала вам нужно прочитать документацию по Android.

2 голосов
/ 19 октября 2011

Если вы используете API уровня 12 или выше, есть метод под названием sameAs для Bitmap, чтобы сделать именно то, что вы ищете.В противном случае, используйте getPixels и сделайте что-то вроде:

int width = bitmap1.getWidth();
int height = bitmap1.getHeight();
int pixelCount = width * height;
int[] pixels1 = new int[pixelCount];
int[] pixels2 = new int[pixelCount];

bitmap1.getPixels(pixels1, 0, 0, 0, 0, width, height);
bitmap2.getPixels(pixels2, 0, 0, 0, 0, width, height);

for (int i = 0; i < pixelCount; i++) {
    if (pixels1[i] != pixels2[i]) {
        return false;
    }
}
return true;

Или, если вы действительно хотите сделать счетчик, чтобы увидеть, сколько пикселей одинаково, продолжайте и сделайте это.

На самом деле, вы, вероятно, тоже можете что-то делать с буферами ... Может быть, что-то вроде

int width = bitmap1.getWidth();
int height = bitmap1.getHeight();
int pixelCount = width * height;
IntBuffer buffer1 = IntBuffer.allocate(pixelCount);
IntBuffer buffer2 = IntBuffer.allocate(pixelCount);
bitmap1.copyPixelsToBuffer(buffer1);
bitmap2.copyPixelsToBuffer(buffer2);
int result = buffer1.compareTo(buffer2);

Я не уверен, как эти два метода сравниваются по производительности, но это что-топоиграйте, если хотите.

0 голосов
/ 19 октября 2011

Порядок вашего алгоритма n ^ 4.

Полагаю, вы могли бы снизить это до n ^ 3, если вы

  1. Обведите все возможные цвета.
  2. внутри этого цикла, цикл на каждом изображении
  3. найти цвета i на каждом изображении
  4. наконец используйте уравнение для увеличения Counter

Если цвет i встречается x раз в bitmap и y раз в bitmap2,

Counter = Counter + x*y

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