J'ai en fait écrit un application qui fait cette même chose.
J'ai commencé par une application précédente qui utilisait une base Distance de Levenshtein pour calculer la similarité des images, mais cette méthode n'est pas souhaitable pour un certain nombre de raisons. Sans aucun doute, l'algorithme le plus rapide que vous trouverez pour déterminer la similarité des images est soit erreur quadratique moyenne ou erreur absolue moyenne (les deux ont un temps d'exécution de O(n), où n est le nombre de pixels dans l'image, et il serait également trivial d'enfiler une implémentation de l'un ou l'autre algorithme de plusieurs façons différentes). L'article de Mecki n'est en fait qu'une mise en œuvre de l'erreur absolue moyenne, que mon application peut exécuter (le code est également disponible pour votre plaisir de navigation, si vous le souhaitez).
Quoi qu'il en soit, dans notre application, nous commençons par sous-échantillonner les images (par exemple, tout est mis à l'échelle, disons, de 32*32 pixels), puis nous convertissons en échelle de gris, et enfin nous soumettons les images résultantes à nos algorithmes de comparaison. Nous travaillons également sur des algorithmes de prétraitement plus avancés pour normaliser davantage les images, mais... nous n'en sommes pas encore là.
Il existe sans aucun doute de meilleurs algorithmes que MSE/MAE (en fait, les problèmes posés par ces deux algorithmes appliqués à l'information visuelle ont été bien documentés), par exemple SSIM mais cela a un coût. D'autres personnes tentent de comparer d'autres qualités visuelles de l'image, comme la luminance, le contraste, les histogrammes de couleur, etc., mais tout cela est coûteux par rapport à la simple mesure du signal d'erreur.
Ma candidature pourrait travail, en fonction de combien de sont dans ces dossiers. Il est multithread (j'ai vu qu'il chargeait pleinement huit cœurs de processeur en effectuant des comparaisons), mais je ne l'ai jamais testé avec une base de données d'images supérieure à quelques centaines d'images. Quelques centaines de gigaoctets d'images semblent prohibitifs. (La simple lecture des images depuis le disque, le sous-échantillonnage, la conversion en échelle de gris et le stockage en mémoire - en supposant que vous ayez assez de mémoire pour tout contenir, ce qui n'est probablement pas le cas - pourrait prendre quelques heures).