Целевое изображение, которое должно найти программное обеспечение, должно быть «тем же» изображением, что и данное изображение, но оно все равно должно «простить» небольшую обработку любого из них.
Если «небольшая обработка» не включает вращение, а только «обрезку», тогда должна работать простая взаимная корреляция, если возможна коррекция перспективы, вращение, коррекция искажения линзы, тогда все будет сложнее.
Я думаю, что этот метод вполне прощает небольшие цветовые коррекции. В любом случае, вы всегда можете конвертировать оба изображения в оттенки серого и сравнивать версии в оттенках серого, если хотите.
Чтобы сфокусировать мой вопрос дальше - я не спрашиваю, какие алгоритмы использовать, на данный момент я бы предпочел использовать существующий инструмент / API / сервис.
Вы можете начать с cvMatchTemplate
из библиотеки OpenCV (ссылка указывает на C-версию API, но она доступна также для C ++ и Python). Используйте обрезанное изображение в качестве шаблона и ищите его на всех ваших изображениях.
Если сравниваемые изображения имеют темные элементы на светлом фоне, вы можете воспользоваться методами CV_TM_CCOEFF
или CV_TM_CCOEFF_NORMED
. Они оба вычитают среднее значение по области шаблона из обоих изображений. Нормализованные методы (CV_TM_*_NORMED
) обычно работают лучше, но медленнее, чем их ненормализованные аналоги.
Возможно, вы захотите выполнить некоторую предварительную обработку изображений перед взаимной корреляцией. Если вы сначала нормализуете их, взаимная корреляция будет менее чувствительной к небольшим изменениям яркости / контрастности. Если вы сначала обнаружите края, как предлагает @misha, вы потеряете информацию о цвете / яркости, но результаты для наложения контуров будут намного лучше.