比较两个不同图像的像素,花费的时间太长

时间:2011-10-19 06:12:47

标签: android image-processing

我想比较两个不同图像的像素。我将第一个图像的像素与第二个图像的所有像素进行比较。这是我的代码:

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 个答案:

答案 0 :(得分:3)

哦不,在Android中进行图像处理时请记住这一点。

  

永远不要连续使用getPixel()或setPixel(),就像循环一样   导致一个非常糟糕的表现,该死的慢。使用getPixels()   和setPixels()改为

好吧,请记住,您需要先阅读Android文档。

答案 1 :(得分:2)

如果您使用的是API级别12或更高版本,Bitmap上有一个名为sameAs的方法可以完全满足您的要求。否则,请使用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);

我不确定这两种方法在性能方面有何比较,但如果你愿意,可以使用它。

答案 2 :(得分:0)

算法的顺序是n ^ 4.

我猜你可以把它推到n ^ 3,如果你

  1. 循环所有可能的颜色。
  2. 在该循环内,循环每个图像
  3. 在每张图片中找到颜色 i 的出现
  4. 最后使用等式增加Counter
  5. 如果bitmap 中的颜色 出现 x 次y {/ em> bitmap2

    Counter = Counter + x*y