Je recommanderais d'envisager de ne plus utiliser simplement un histogramme RVB.
Un meilleur résumé de votre image peut être obtenu si vous prenez une ondelette 2d Haar de l'image (c'est beaucoup plus facile qu'il n'y paraît, c'est juste beaucoup de moyennes et quelques racines carrées utilisées pour pondérer vos coefficients) et de conserver simplement le k plus grand coefficients pondérés dans l'ondelette en tant que vecteur fragmenté, normaliser et enregistrer cela pour réduire sa taille. Vous devez au moins redimensionner RG et B en utilisant des poids perceptifs au moins ou je vous recommande de passer à YIQ (ou YCoCg, pour éviter le bruit de quantification) afin de pouvoir échantillonner les informations de chrominance avec une importance réduite.
Vous pouvez maintenant utiliser le produit scalaire de deux de ces vecteurs normalisés clairsemés comme mesure de similitude. Les paires d'images avec les produits scalaires les plus importants auront une structure très similaire. Cela a l'avantage d'être légèrement résistant au redimensionnement, au changement de teinte et au tatouage, et d'être vraiment facile à mettre en œuvre et compact.
Vous pouvez concilier stockage et précision en augmentant ou en diminuant k.
Le tri par un seul score numérique sera insoluble pour ce type de problème de classification. Si vous y réfléchissez, il faudrait que les images ne puissent «changer» que le long d'un axe, mais ce n'est pas le cas. C'est pourquoi vous avez besoin d'un vecteur de fonctionnalités. Dans le cas de l'ondelette de Haar, c'est à peu près l'endroit où se produisent les discontinuités les plus nettes de l'image. Vous pouvez calculer une distance entre des images par paires, mais comme tout ce que vous avez est une métrique de distance, un ordre linéaire n'a aucun moyen d'exprimer un «triangle» de 3 images qui sont toutes également distantes. (c'est-à-dire pensez à une image entièrement verte, une image entièrement rouge et une image toute bleue.)
Cela signifie que toute solution réelle à votre problème nécessitera des opérations O (n ^ 2) dans le nombre d'images que vous avez. Alors que s'il avait été possible de linéariser la mesure, vous pourriez avoir besoin de seulement O (n log n) ou O (n) si la mesure convenait, par exemple, à un tri par base. Cela dit, vous n'avez pas besoin de dépenser O (n ^ 2) car dans la pratique, vous n'avez pas besoin de passer au crible l'ensemble, vous avez juste besoin de trouver les éléments qui sont plus proches d'un certain seuil. Ainsi, en appliquant l'une des nombreuses techniques pour partitionner votre espace vectoriel clairsemé, vous pouvez obtenir des asymptotiques beaucoup plus rapides pour le problème `` me trouver des images qui sont plus similaires qu'un seuil donné '' que de comparer naïvement chaque image à chaque image, vous donnant ce que vous avez probablement besoin de ...
En tout cas, je l'ai utilisé il y a quelques années à bon escient personnellement en essayant de minimiser le nombre de textures différentes que je stockais, mais il y a aussi eu beaucoup de bruit de recherche dans cet espace montrant son efficacité (et dans ce cas en comparant une forme plus sophistiquée de classification d'histogramme)
http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf
Si vous avez besoin d'une meilleure précision de détection, les algorithmes minHash et tf-idf peuvent être utilisés avec l'ondelette de Haar (ou l'histogramme) pour traiter les modifications de manière plus robuste:
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
Enfin, Stanford propose une recherche d'images basée sur une variante plus exotique de ce type d'approche, basée sur l'extraction de davantage de fonctionnalités à partir des ondelettes pour trouver des sections d'images pivotées ou mises à l'échelle, etc., mais cela va probablement bien au-delà de la quantité de travail que vous 'voudrais faire.
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi