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.
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
Consejos
-
El más grande que
50
está en elrgb
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 de4: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.