Как быстрее всего сравнить два растровых изображения одинакового размера, чтобы определить, являются ли они идентичными?
Я пытаюсь написать функцию, чтобы определить, являются ли две битовые карты одинакового размера идентичными или нет. Функция, которая у меня есть сейчас, просто сравнивает пиксель за раз в каждом растровом изображении, возвращая ложь в первом неравном пикселе.
Хотя это работает и хорошо работает для небольших растровых изображений, на производстве я собираюсь использовать это в тесном цикле и на больших изображениях, поэтому мне нужен лучший способ. У кого-нибудь есть рекомендации?
Кстати, я использую язык C # - и да, я уже использую метод .LockBits. знак равно
редактироватьЯ кодировал реализации некоторых из приведенных предложений, и вот тесты. Настройка: две идентичные (в худшем случае) битовые карты размером 100x100 с 10 000 итераций каждая. Вот результаты:
CompareByInts (Marc Gravell) : 1107ms
CompareByMD5 (Skilldrick) : 4222ms
CompareByMask (GrayWizardX) : 949ms
В CompareByInts и CompareByMask я использую указатели для прямого доступа к памяти; в методе MD5 я использую Marshal.Copy для получения массива байтов и передачи его в качестве аргумента в MD5.ComputeHash. CompareByMask только немного быстрее, но, учитывая контекст, я думаю, что любое улучшение полезно.
Всем спасибо. знак равно
Редактировать 2: Забыли включить оптимизацию - это делает ответ GrayWizardX еще большим стимулом:
CompareByInts (Marc Gravell) : 944ms
CompareByMD5 (Skilldrick) : 4275ms
CompareByMask (GrayWizardX) : 630ms
CompareByMemCmp (Erik) : 105ms
Интересно, что метод MD5 вообще не улучшился.
Редактировать 3: Написал мой ответ (MemCmp), который взорвал другие методы из воды. o.o