Самый быстрый способ сравнить пиксельные значения между двумя BufferedImages?

У меня есть BufferedImage типа TYPE_INT_BGR. Я должен сделать попиксельное сравнение с другим BufferedImage для вычислений "расстояния" между двумя изображениями. У меня есть что-то, что работает, но является медленным. Я получаю пиксель из "ссылочного" изображения, разбиваю его в байты RGB с:

    int pixel = referenceImage.getRGB(col, row);
    int red   = (pixel >> 16) & 0xff;
    int green = (pixel >> 8) & 0xff;
    int blue  = (pixel) & 0xff;

Я сравниваю значения r/g/b с соответствующим пикселем изображения кандидата и подвожу итог квадратов различия.

Существует ли более быстрый способ сделать этот вид сравнения? Посмотрев в источник JRE, я вижу, что BufferedImage.getRGB () является на самом деле осуществлением операции ИЛИ составляющие значения RGB от растра вместе, который расточителен в моих целях, так как я просто разламываю его на байты снова.

Я собираюсь попытаться делать это непосредственно, но интересно, нет ли лучшего способа сделать это, или через Java или через третью сторону API, который я, возможно, пропустил.

6
задан George Armhold 29 December 2009 в 17:31
поделиться

3 ответа

Чтение данных с VolatileImage не будет быстрее. Что делает VolatileImages "быстрее", так это то, что они используют для рисования изображений ускоренную (VRAM) память вместо системной (RAM). Однако при чтении может потребоваться доступ к памяти по другой шине, и для этих операций он медленнее, чем системная память.

Самым быстрым способом сравнения BufferedImages было бы использование целочисленных сравнений, о которых вы говорили в своей заметке, но, как вы уже упоминали, вы не можете использовать getRGB по причинам, связанным с производительностью. Вы можете получить партию пикселей в массив, но в целом, вероятно, вам следует просто заглянуть в Raster и DataBuffer для получения информации о производительности

.
3
ответ дан 16 December 2019 в 21:41
поделиться

Если оба изображения используют одну и ту же цветовую модель и выборку, то сравнение можно провести на DataBuffer растра, что будет немного быстрее.

.
2
ответ дан 16 December 2019 в 21:41
поделиться

Рассматривали ли Вы возможность использования Java2D для создания нового образа, представляющего собой -различие между двумя изображениями, а затем проанализировать вместо него изображение различия?

Моим первоначальным подходом было бы взять негатив изображения A и добавить изображение B.

.
2
ответ дан 16 December 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: