Android 比较两幅不同图像的像素,耗时太长

Android 比较两幅不同图像的像素,耗时太长,android,image-processing,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<bitmpa

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

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++ ;
          }
       }
    }
}
for(int i=0;i对于(int k=0;k噢,不,在Android中进行图像处理时,请记住这一点

永远不要连续使用getPixel()或setPixel(),就像循环一样,它会 导致非常糟糕的性能,非常慢。使用getPixels() 而改为setPixels()


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

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

永远不要连续使用getPixel()或setPixel(),就像循环一样,它会 导致非常糟糕的性能,非常慢。使用getPixels() 而改为setPixels()


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

您的算法顺序为n^4

我想你可以把它降到n^3,如果你

  • 循环所有可能的颜色
  • 在这个循环中,在每个图像上循环
  • 找出每幅图像中出现的颜色i
  • 最后,使用一个等式来递增
    计数器
  • 如果颜色i
    位图中出现x次,在
    位图中出现y


    Counter=Counter+x*y

    算法的顺序是n^4

    我想你可以把它降到n^3,如果你

  • 循环所有可能的颜色
  • 在这个循环中,在每个图像上循环
  • 找出每幅图像中出现的颜色i
  • 最后,使用一个等式来递增
    计数器
  • 如果颜色i
    位图中出现x次,在
    位图中出现y


    Counter=Counter+x*y

    如果您使用的是API级别12或更高的API,则有一个名为
    Bitmap
    的方法来精确执行您要查找的操作。否则,请使用并执行以下操作:

    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;
    

    我不确定这两种方法的性能比较如何,但如果您愿意,可以尝试一下。

    如果您使用的是API级别12或更高的API,则有一种名为
    Bitmap
    的方法可以完全满足您的要求。否则,请使用并执行以下操作:

    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;
    

    我不确定这两种方法的性能比较如何,但如果你愿意的话,可以尝试一下。

    图像的尺寸和方向是否相同?@Ruel是的,图像的尺寸相同。是否有可能在android中获得指向原始位图缓冲区的指针?如果是这样的话,你可以通过比较中的32位来获得32倍的加速两个缓冲区的整数,并且只有当它们不同时,才放大到解压缩位图的位。getPixel()正在做什么?如果位图宽度不是32的整数倍,您还必须处理边界问题。@Dov Grobgeld:我不完全理解您的观点。您能详细说明一下吗?图像是否具有相同的尺寸和方向?@Ruel是的,图像具有相同的尺寸。是否有可能获得指向原始位图缓冲区的指针在android中?如果是这样的话,你可以通过比较两个缓冲区的32位整数来获得32倍的加速,并且只有在它们不同的情况下,才放大到解压缩位图的位。getPixel()正在做什么?如果位图宽度不是32的整数倍,您还必须处理边界问题。@Dov Grobgeld:我不完全理解您的观点。您能详细说明一下吗?您的getPixels调用将失败,正如所写的那样,步幅必须大于等于宽度。嘿,我的问题是,我想得到比较百分比,比如100像素,它们都有多少像素l匹配或不匹配(即85%或85像素相同)这是我想要的,请帮助您的getPixels调用将以写入方式失败,步幅必须大于等于宽度。嘿,我的问题是我想要得到比较%像100像素,两者都有多少像素匹配或不匹配(即85%或85像素相同)这是我想要的,请帮助