Если вам действительно нужно ускорить процесс, вы можете проверить тип DataBuffer
и предоставить оптимизированный код для конкретного типа, чтобы сохранить вызовы на getElem(i)
. Это немного ускорит ваш код.
Примерно так:
DataBuffer db1 = img1.getData().getDataBuffer();
DataBuffer db2 = img2.getData().getDataBuffer();
int totalDiff = 0;
int x, y;
if (db1 instanceof DataBufferInt && db2 instanceof DataBufferInt) {
int[] data1 = ((DataBufferInt) db1).getData();
int[] data2 = ((DataBufferInt) db2).getData();
for (int i = 0; i < WIDTH * HEIGHT; ++i) {
x = data1[i];
y = data2[i];
totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
+ Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
+ Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16));
}
} else {
for (int i = 0; i < WIDTH * HEIGHT; ++i) {
x = db1.getElem(i);
y = db2.getElem(i);
totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
+ Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
+ Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16));
}
}
Edit:
Другая идея, которая принесет вам НАМНОГО более высокую скорость. Если это всего лишь эвристика, этого может быть достаточно, чтобы рассчитать разницу в несколько «урезанной» версии ваших изображений. Замените ++i
на i+=10
и увеличьте скорость в 10 раз. Конечно, если это имеет смысл, зависит от типов ваших изображений.
Edit:
В одном из комментариев вы упомянули, что это функция пригодности для GA ... в этом случае может быть достаточно взять 100 (или просто 10?) Случайных мест из ваших изображений и сравнить пиксели в этих местах. Полученное ускорение, скорее всего, превзойдет потерю точности.