2013-05-06 3 views
0

Я ищу эффективный способ увидеть, было ли изменено растровое изображение. Подход, который я использую в настоящее время, заключается в использовании метода copyPixelsToBuffer (Buffer dst) в классе Bitmap для каждого изображения. Затем я смогу сравнить эти два буфера, чтобы узнать, есть ли разница.Определение разницы между двумя растровыми изображениями

Это не похоже, что метод sameAsAs, представленный в классе битмапа, полезен в этом сценарии.

Другой способ, который я собирался реализовать, - использовать метод .getPixel() и сравнить оба изображения, которые не будут иметь эффективности.

+0

Способ чего? Какая библиотека программирования/язык? –

+0

Я считаю, что это java, возможно, на Android? – Murkaeus

+0

Разработка на Android, извините, что я забыл указать – Matt

ответ

0

Если вы пытаетесь эффективно определить, изменилось ли изображение или нет, было бы лучше рассчитать хэш SHA1 исходного изображения и сохранить его. Затем при сравнении потенциально измененного изображения вам нужно только открыть новое изображение и «Хешировать эти байты», а затем сравнить с 20-байтовым хэшем исходного изображения. Если оба изображения совпадают, то значение хеша будет одинаковым. Если изображения отличаются друг от друга, SHA1-хэш будет другим.

EDIT (база отзывов комментариев): Если ваша система ожидает много изменений, которые могут произойти часто, вы можете взять распределенный образец битов в файле для хэша. Сколько зависит от количества пикселей, которые вы ожидаете изменить (на основе исторических данных), и сколько вам нужно пробовать, чтобы иметь 95% статистический доверительный интервал.

Если он сказал, что файлы были одинаковыми, вы можете вернуться к сравнению каждого бита (или сохраненного хэша полного файла). Это ускорит процесс сценариев, в которых ожидалось много изменений, и вы просто хотите подтвердить, что пользователь действительно внес изменения.

Это ограничило бы количество раз, когда вам приходилось обращаться к битам исходного файла.

+0

Следует отметить, что хеширование просто вводит ненужные накладные расходы - вам все равно нужно выполнять итерацию через пиксель + выполняет другие операции. Даже если вы сравниваете изображения несколько раз, хэширующий подход может не принести пользы, как во многих сценариях, вы ожидаете, что различия будут обнаружены после просто взгляда на несколько пикселей. – denver

+0

Правда, алгоритм хэширования работает хорошо, если вы не ожидаете изменений очень часто. Это имеет тенденцию быть менее эффективным, если изменения в изображениях являются нормой в вашей системе. Ответчик не указал задний сценарий, поэтому нам остается угадать. –

0

Для простого сравнения двух буферов данных изображений вы можете выполнить двоичный поиск изменений.

У этого есть потенциал для улучшения при простой проверке на пиксель, поскольку большинство изменений в изображениях производится в группах пикселей в непосредственной близости, а не только в одном пикселе.

Так, например, если массив был длиной 100, вы можете проверить индексы в следующем порядке.

Уровень 1 - 50

Уровень 2 - 25, 75

Уровень 3 - 12, 37, 62, 87

Уровень 4 - 6, 18, 31, 43, 56, 68 , 81, 93

и т.д.

Если вы нашли изменения, остановитесь. В худшем случае нет изменений, и вы проверяете каждый пиксель.

Сообщите мне, если вы ищете что-то еще или если вам нужна помощь в его реализации.

+0

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

+0

@KevinHsu Это зависит от ситуации, но, возможно, вы правы. Если это java/android, этот вопрос релевантен: http://stackoverflow.com/questions/4011327/alternative-to-bitmap-getpixel – Murkaeus

0

Просто получите буферы, представляющие данные изображения, и проведите по пикселям, сравнивая их значения.

Смежные вопросы