Isso depende inteiramente de quão inteligente você deseja que o algoritmo seja.
Por exemplo, aqui estão alguns problemas:
- imagens cortadas x uma imagem não cortada
- imagens com um texto adicionado vs. outro sem
- imagens espelhadas
O algoritmo mais fácil e simples que vi para isso é apenas executar as seguintes etapas para cada imagem:
- dimensione para algo pequeno, como 64x64 ou 32x32, desconsidere a proporção, use um algoritmo de escala de combinação em vez do pixel mais próximo
- dimensione os intervalos de cores de modo que o mais escuro seja o preto e o mais claro o branco
- gire e vire a imagem de modo que a cor mais clara fique no canto superior esquerdo e, em seguida, o canto superior direito é o próximo mais escuro, o canto inferior esquerdo é o próximo mais escuro (o mais longe possível, é claro)
Editar Um algoritmo de escalonamento de combinação é aquele que, ao dimensionar 10 pixels para um, o fará usando uma função que pega a cor de todos esses 10 pixels e os combina em um. Pode ser feito com algoritmos como média, valor médio ou mais complexos como splines bicúbicos.
Em seguida, calcule a distância média pixel a pixel entre as duas imagens.
Para pesquisar uma possível correspondência em um banco de dados, armazene as cores de pixel como colunas individuais no banco de dados, indexe um monte deles (mas não todos, a menos que você use uma imagem muito pequena) e faça uma consulta que use um intervalo para cada valor de pixel, ou seja, todas as imagens em que o pixel na imagem pequena está entre -5 e +5 da imagem que você deseja visualizar.
Isso é fácil de implementar e bastante rápido de executar, mas é claro que não lidará com as diferenças mais avançadas. Para isso, você precisa de algoritmos muito mais avançados.