Конечно, есть приложения и библиотеки, которые уже делают то, что вы пытаетесь сделать, но я ничего не знаю об этом. Очевидно, что можно хэшировать два изображения и сравнивать, но это ожидает, что вещи будут идентичны , и не оставляет никакой свободы для легких различий или подобных вещей.
Предполагая, что вы контролировали объекты на изображениях, ориентированных одинаково и позиционируемых одинаково, одна вещь, которую мог бы сделать, это пройтись по пикселям каждого изображения и получить значения HSV для каждого из них, например, :
Color color1 = Image1.GetPixel(i,j);
Color color2 = Image2.GetPIxel(i,j);
float hue1 = color1.GetHue();
float sat1 = color1.GetSaturation();
float bright1 = color1.GetBrightness();
float hue2 = color2.GetHue();
float sat2 = color2.GetSaturation();
float bright2 = color2.GetBrightness();
и сделайте некоторые сравнения с этими значениями. Это позволило бы вам сравнивать их, как мне кажется, с большей надежностью, чем использование значений RGB, особенно если учесть, что вы хотите включить некоторые допуски в ваше сравнение.
Edit:
Ради интереса я написал небольшое приложение, которое использовало мою идею выше. По сути, это было общее количество пикселей, чьи значения H, S и V отличались на некоторое количество (я выбрал 0,1 в качестве моего значения), а затем выпало из циклов сравнения, если счетчики H, S или V превышают 38400 или 2% от пиксели (0,02 *1600* 1200). В худшем случае для сравнения двух одинаковых изображений потребовалось около 2 секунд. Когда я сравнивал изображения, в которых одно было изменено настолько, чтобы превысить это значение 2%, обычно это занимало долю секунды.
Очевидно, что это было бы слишком медленно, если бы в секунду создавалось много изображений, но я все равно подумал, что это интересно.