Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Encontre imagens semelhantes em (puro) PHP / MySQL


Eu tive isso exato mesma questão antes.

Sinta-se à vontade para copiar o que eu fiz, e espero que isso ajude/resolva seu problema.

Como resolvi


Minha primeira ideia que falhou, semelhante ao que você pode estar pensando, é que acabei fazendo strings para cada imagem (não importa o tamanho). Mas eu rapidamente descobri que isso enche seu banco de dados super rápido e não foi eficaz.

A próxima opção (que funciona) era uma imagem menor (como seu 5px ideia), e fiz exatamente isso, mas com 10px *10px imagens. A maneira como criei o 'hash' para cada imagem foi o imagecolorat() função.

Veja php.net aqui.

Ao receber o rgb cores para a imagem, eu as arredondamos para o 50 mais próximo , para que as cores fossem menos específicas. Esse número (50 ) é o que você deseja alterar dependendo de quão específico você deseja que suas pesquisas sejam.

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

Depois de fazer isso para cada pixel (10px *10px lhe dará 100 rgb() 's back), eu os transformei em um array e os armazenei no banco de dados como base64_encode() e serialize() .

Ao fazer a pesquisa de imagens semelhantes, fiz exatamente o mesmo processo para a imagem que eles queriam enviar e, em seguida, extraí os 'hashes' da imagem do banco de dados para compará-los todos e ver o que correspondia ao rgb 's.

Dicas


  • O maior que 50 está no rgb arredondamento, o menos específico sua pesquisa será (e vice-versa).

  • Se você deseja que seu SQL para ser mais específico, pode ser melhor armazenar extra/específico informações sobre a imagem no banco de dados, para que você possa limitar as pesquisas feitas no banco de dados. por exemplo . se a proporção for 4:3 , apenas extraia imagens em torno de 4:3 do banco de dados. (etc)

  • Pode ser difícil obter isso perfeitamente 5px *5px , então uma sugestão é phpthumb . Eu usei com a sintaxe:

Boa sorte amigo, espero ter ajudado.