Это полностью зависит от того, насколько умным вы хотите, чтобы алгоритм был.
Например, вот некоторые проблемы:
- обрезанные изображения по сравнению с необрезанным изображением
- изображения с добавленным текстом по сравнению с другим без
- зеркальные изображения
Самый простой и простой алгоритм, который я видел, - это просто проделать следующие шаги с каждым изображением:
- масштабировать до чего-то небольшого, например 64x64 или 32x32, игнорировать соотношение сторон, использовать алгоритм комбинирования масштабирования вместо ближайшего пикселя
- масштабируйте диапазон цветов так, чтобы самый темный был черным, а самый светлый - белым
- повернуть и отразить изображение так, чтобы самый светлый цвет находился в верхнем левом углу, затем верхний правый цвет был следующим темнее, нижний левый - следующим темнее (конечно, насколько это возможно)
Редактировать алгоритм комбинирования масштабирования является один , что при масштабировании 10 пикселей вниз на один будет делать это с помощью функции , которая принимает цвет всех этих 10 пикселей и объединяет их в одно целое. Может быть выполнено с помощью таких алгоритмов, как усреднение, среднее значение или более сложных, таких как бикубические сплайны.
Затем вычислите среднее расстояние пиксель за пикселем между двумя изображениями.
Чтобы найти возможное совпадение в базе данных, сохраните цвета пикселей в виде отдельных столбцов в базе данных, проиндексируйте их группу (но не все, если вы не используете очень маленькое изображение) и выполните запрос, который использует диапазон для каждого значение пикселя, т.е. каждое изображение, где пиксель в маленьком изображении находится между -5 и +5 изображения, которое вы хотите найти.
Это легко реализовать и довольно быстро запустить, но, конечно, не справится с большинством сложных различий. Для этого вам понадобятся гораздо более продвинутые алгоритмы.