sql >> Base de Datos >  >> RDS >> Mysql

Encuentra imágenes similares en (puro) PHP / MySQL

He tenido este exacto mismo problema antes.

Siéntase libre de copiar lo que hice, y espero que lo ayude / resuelva su problema.

Cómo lo resolví

Mi primera idea que fracasó, similar a lo que puede estar pensando, es que terminé creando cadenas para cada imagen (sin importar el tamaño). Pero rápidamente descubrí que esto llena su base de datos súper rápido y no fue efectivo.

La siguiente opción (que funciona) era una imagen más pequeña (como su 5px idea), e hice exactamente eso, pero con 10px *10 píxeles imágenes La forma en que creé el 'hash' para cada imagen fue imagecolorat() función.

Ver php.net aquí.

Al recibir el rgb colores para la imagen, los redondeé al 50 más cercano , para que los colores fueran menos específicos. Ese número (50 ) es lo que desea cambiar dependiendo de qué tan específico quieres que sean tus búsquedas.

por ejemplo:

// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50

Después de hacer esto con cada píxel (10px *10 píxeles te dará 100 rgb() 's back), luego los convertí en una matriz y los almacené en la base de datos como base64_encode() y serializar() .

Al realizar la búsqueda de imágenes similares, realicé exactamente el mismo proceso con la imagen que querían cargar y luego extraje los 'hashes' de la imagen de la base de datos para compararlos todos y ver qué tenía el rgb 's.

Consejos

  • El más grande que 50 está en el rgb redondeo, el menos específico su búsqueda será (y viceversa).

  • Si quieres tu SQL para ser más específicos, puede ser mejor almacenar extra/específico información sobre la imagen en la base de datos, para que pueda limitar las búsquedas que obtiene en la base de datos. por ejemplo . si la relación de aspecto es 4:3 , solo arrastra imágenes alrededor de 4:3 de la base de datos (etc)

  • Puede ser difícil obtener esto perfectamente 5px *5 píxeles , por lo que una sugerencia es phpthumb . Lo usé con la sintaxis:

Buena suerte compañero, espero poder ayudar.