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像素相同)这是我想要的,请帮助