Mysql
 sql >> Base de données >  >> RDS >> Mysql

Trouver des images similaires en PHP (pur) / MySQL

J'ai eu ce exact même problème avant.

N'hésitez pas à copier ce que j'ai fait, et j'espère que cela vous aidera / résoudra votre problème.

Comment j'ai résolu le problème

Ma première idée qui a échoué, similaire à ce que vous pensez peut-être, est que j'ai fini par créer des chaînes pour chaque image (quelle que soit sa taille). Mais j'ai rapidement compris que cela remplissait votre base de données très rapidement et n'était pas efficace.

L'option suivante (qui fonctionne) était une image plus petite (comme votre 5px idée), et j'ai fait exactement cela, mais avec 10px *10px images. La façon dont j'ai créé le "hachage" pour chaque image était le imagecolorat() fonction.

Voir php.net ici.

Lors de la réception du rgb couleurs pour l'image, je les ai arrondies au 50 le plus proche , de sorte que les couleurs étaient moins spécifiques. Ce nombre (50 ) correspond à ce que vous souhaitez modifier en fonction de la spécificité vous voulez que vos recherches soient.

par exemple :

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

Après avoir fait cela à chaque pixel (10px *10px vous donnera 100 rgb() est de retour), je les ai ensuite transformés en tableau et les ai stockés dans la base de données sous le nom base64_encode() et serialize() .

Lors de la recherche d'images similaires, j'ai suivi exactement le même processus pour l'image qu'ils souhaitaient télécharger, puis j'ai extrait les "hachages" d'image de la base de données pour les comparer tous et voir ce qui correspondait à rgb s.

Conseils

  • Le plus grand ce 50 est dans le rgb arrondi, le moins spécifique votre recherche sera (et vice versa).

  • Si vous voulez que votre SQL pour être plus précis, il peut être préférable de stocker extra/specific informations sur l'image dans la base de données, afin que vous puissiez limiter les recherches que vous obtenez dans la base de données. par exemple . si le format d'image est 4:3 , tirez uniquement les images autour de 4:3 de la base de données. (etc.)

  • Il peut être difficile d'obtenir parfaitement ce 5px *5px , donc une suggestion est phpthumb . Je l'ai utilisé avec la syntaxe :

Bonne chance mon pote, j'espère pouvoir t'aider.