Esto depende completamente de cuán inteligente quiera que sea el algoritmo.
Por ejemplo, aquí hay algunas cuestiones:
- imágenes recortadas frente a una imagen sin recortar
- imágenes con un texto añadido vs.otro sin
- imágenes reflejadas
El algoritmo más fácil y sencilla que he visto para esto es sólo para que realice los siguientes pasos para cada imagen:
- escala para algo pequeño, como 64x64 o 32x32, desatender la relación de aspecto, usar un algoritmo de escala combinada en lugar del píxel más cercano
- escalar los rangos de color para que el más oscuro sea negro y el más claro sea blanco
- rotar y voltear la imagen de modo que el color lighest es superior izquierda, y luego la parte superior derecha se siguiente más oscuro, inferior izquierda está al lado más oscuro (la medida de lo posible, por supuesto)
Editar A combinando El algoritmo de escalado es aquel que al escalar 10 píxeles a uno lo hará usando una función que toma el color de esos 10 píxeles y los combina en uno. Se puede hacer con algoritmos como promediado, valor medio o más complejos, como splines bicúbicos.
A continuación, calcule la distancia media píxel por píxel entre las dos imágenes.
Para buscar una posible coincidencia en una base de datos, almacene los colores de los píxeles como columnas individuales en la base de datos, indexe un grupo de ellos (pero no todos, a menos que use una imagen muy pequeña) y haga una consulta que use un rango para cada valor de píxel, es decir. cada imagen donde el píxel de la imagen pequeña se encuentra entre -5 y +5 de la imagen que desea buscar.
Esto es fácil de implementar, y bastante rápido de ejecutar, pero por supuesto no manejará las diferencias más avanzadas. Para eso necesitas algoritmos mucho más avanzados.
Hay algunas buenas respuestas en esta otra pregunta similar: http://stackoverflow.com/questions/75891/ algorithm-for-finding-similar-images – blak
Y más aquí: http://stackoverflow.com/questions/189943/how-can-i-quantify-difference-between-two-images – Anoyz
Es hora de actualizar las respuestas a la luz de los recientes avances en Machine Learning y más específicamente "Deep Learning". – jldupont