Esto depende completamente de cuán inteligente quieras que sea el algoritmo.
Por ejemplo, aquí hay algunos problemas:
- imágenes recortadas frente a una imagen sin recortar
- imágenes con un texto agregado frente a otro sin
- imágenes reflejadas
El algoritmo más fácil y simple que he visto para esto es simplemente realizar los siguientes pasos para cada imagen:
- escalar a algo pequeño, como 64x64 o 32x32, ignorar la relación de aspecto, usar un algoritmo de escala de combinación en lugar del píxel más cercano
- Escale los rangos de color para que el más oscuro sea el negro y el más claro el blanco.
- gire y voltee la imagen para que el color más claro sea el de arriba a la izquierda, y luego el de arriba a la derecha sea el siguiente más oscuro, el de abajo a la izquierda sea el siguiente más oscuro (en la medida de lo posible, por supuesto)
Editar un algoritmo de escalado combinado es aquel que al escalar 10 píxeles a uno lo hará usando una función que toma el color de todos esos 10 píxeles y los combina en uno. Se puede hacer con algoritmos como promediar, valor medio o más complejos como splines bicúbicos.
Luego, 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 algunos de ellos (pero no todos, a menos que use una imagen muy pequeña) y haga una consulta que use un rango para cada uno. valor de píxel, es decir. cada imagen en la que el píxel de la imagen pequeña esté 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.