Quel est un moyen rapide de trier un ensemble d'images donné en fonction de leur similitude.
Pour le moment, j'ai un système qui analyse l'histogramme entre deux images, mais c'est une opération très coûteuse et semble trop exagérée.
Idéalement, je recherche un algorithme qui donnerait à chaque image un score (par exemple un score entier, tel que la moyenne RVB) et je peux simplement trier par ce score. Des scores identiques ou côte à côte sont des doublons possibles.
0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994
La moyenne RVB par image est nul, y a-t-il quelque chose de similaire?
image
image-processing
sorting
cbir
L'inconnu
la source
la source
Réponses:
Il y a eu de nombreuses recherches sur la recherche d'images et les mesures de similitude. Ce n'est pas un problème facile. En général, un seul
int
ne suffira pas pour déterminer si les images sont très similaires. Vous aurez un taux de faux positifs élevé.Cependant, comme de nombreuses recherches ont été effectuées, vous pourriez en examiner quelques-unes. Par exemple, cet article (PDF) donne un algorithme d'empreinte digitale d'image compacte qui convient pour trouver des images en double rapidement et sans stocker beaucoup de données. Il semble que ce soit la bonne approche si vous voulez quelque chose de robuste.
Si vous recherchez quelque chose de plus simple, mais certainement plus ad hoc, cette question SO a quelques idées décentes.
la source
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
la source
J'ai implémenté un algorithme très fiable pour cela appelé Interrogation d'image multi-résolution rapide . Mon code (ancien, non maintenu) pour cela est ici .
L'interrogation d'image multi-résolution rapide consiste à diviser l'image en 3 parties en fonction de l'espace colorimétrique YIQ (mieux pour faire correspondre les différences que RVB). Ensuite, l'image est essentiellement compressée à l'aide d'un algorithme d'ondelettes jusqu'à ce que seules les caractéristiques les plus importantes de chaque espace colorimétrique soient disponibles. Ces points sont stockés dans une structure de données. Les images de requête passent par le même processus et les principales fonctionnalités de l'image de requête sont comparées à celles de la base de données stockée. Plus il y a de correspondances, plus les images sont susceptibles d'être similaires.
L'algorithme est souvent utilisé pour la fonctionnalité "requête par croquis". Mon logiciel permettait uniquement de saisir des images de requête via une URL, il n'y avait donc pas d'interface utilisateur. Cependant, j'ai trouvé que cela fonctionnait exceptionnellement bien pour faire correspondre les vignettes à la grande version de cette image.
Retrievr est beaucoup plus impressionnant que mon logiciel, qui vous permet d'essayer l'algorithme FMIQ en utilisant des images Flickr comme source. Très cool! Essayez-le via un croquis ou en utilisant une image source, et vous pourrez voir à quel point cela fonctionne.
la source
Une image a de nombreuses fonctionnalités, donc à moins que vous ne vous limitiez à une seule, comme la luminosité moyenne, vous avez affaire à un espace de problème à n dimensions.
Si je vous demandais d'attribuer un seul entier aux villes du monde, afin que je puisse dire lesquelles sont proches, les résultats ne seraient pas géniaux. Vous pouvez, par exemple, choisir le fuseau horaire comme entier unique et obtenir de bons résultats avec certaines villes. Cependant, une ville près du pôle nord et une autre ville près du pôle sud peuvent également être dans le même fuseau horaire, même si elles sont aux extrémités opposées de la planète. Si je vous laisse utiliser deux entiers, vous pourriez obtenir de très bons résultats avec la latitude et la longitude. Le problème est le même pour la similitude des images.
Cela dit, il existe des algorithmes qui tentent de regrouper des images similaires, ce que vous demandez. C'est ce qui se passe lorsque vous effectuez la détection des visages avec Picasa. Avant même d'identifier des visages, il regroupe les visages similaires afin qu'il soit facile de parcourir un ensemble de visages similaires et de donner à la plupart d'entre eux le même nom.
Il existe également une technique appelée Analyse des composants principaux, qui vous permet de réduire les données à n dimensions à un nombre inférieur de dimensions. Ainsi, une image avec n caractéristiques pourrait être réduite à une caractéristique. Cependant, ce n'est toujours pas la meilleure approche pour comparer des images.
la source
Il existe une bibliothèque C ("libphash" - http://phash.org/ ) qui calculera un "hachage perceptif" d'une image et vous permettra de détecter des images similaires en comparant les hachages (vous n'avez donc pas à comparer chaque image directement contre toutes les autres images) mais malheureusement, cela ne semblait pas très précis lorsque je l'ai essayé.
la source
Vous devez décider de ce qui est «similaire». Contraste? Teinte?
Une image est-elle "similaire" à la même image à l'envers?
Je parie que vous pouvez trouver beaucoup "d'appels proches" en divisant les images en morceaux 4x4 et en obtenant une couleur moyenne pour chaque cellule de la grille. Vous auriez seize partitions par image. Pour juger de la similitude, vous feriez juste une somme de carrés de différences entre les images.
Je ne pense pas qu'un seul hachage ait du sens, à moins que ce ne soit contre un seul concept comme la teinte, la luminosité ou le contraste.
Voici votre idée:
Tout d'abord, je vais supposer que ce sont des nombres décimaux qui sont R * (2 ^ 16) + G * (2 ^ 8) + B, ou quelque chose comme ça. De toute évidence, ce n'est pas bon car le rouge est excessivement pondéré.
Se déplacer dans l'espace HSV serait mieux. Vous pouvez répartir les bits de HSV dans le hachage, ou simplement régler H ou S ou V individuellement, ou vous pouvez avoir trois hachages par image.
Encore une chose. Si vous pesez R, V et B. Poids vert le plus élevé, puis rouge, puis bleu pour correspondre à la sensibilité visuelle humaine.
la source
À l'ère des services Web, vous pouvez essayer http://tineye.com
la source
La question Bon moyen d'identifier des images similaires? semble apporter une solution à votre question.
la source
J'ai supposé qu'un autre logiciel de recherche d'images en double effectuait une FFT sur les images et stockait les valeurs des différentes fréquences sous forme de vecteurs:
puis vous pouvez comparer deux images pour l' égalité en calculant la distance entre les vecteurs de poids de deux images:
la source
Une solution consiste à effectuer une comparaison RMS / RSS sur chaque paire d'images nécessaires pour effectuer un tri à bulles. Deuxièmement, vous pouvez effectuer une FFT sur chaque image et effectuer un calcul de la moyenne des axes pour récupérer un seul entier pour chaque image que vous utiliseriez comme index pour trier. Vous pouvez envisager de faire n'importe quelle comparaison sur une version redimensionnée (25%, 10%) de l'original en fonction de la petite différence que vous choisissez d'ignorer et de l'accélération dont vous avez besoin. Faites-moi savoir si ces solutions sont intéressantes, et nous pouvons discuter ou je peux fournir un exemple de code.
la source
La plupart des approches modernes pour détecter la détection d'image quasi dupliquée utilisent la détection de points intéressants et des descripteurs décrivant la zone autour de ces points. Le SIFT est souvent utilisé. Ensuite, vous pouvez quatiser les descripteurs et utiliser des clusters comme vocabulaire de mots visuels.
Donc, si nous voyons le rapport entre les mots visuels communs de deux images et tous les mots visuels de ces images, vous estimez la similitude entre les images. Il y a beaucoup d'articles intéressants. L'un d'eux est la détection d'image presque en double: pondération minHash et tf-idf
la source
Par exemple, en utilisant l'extension IMMI et IMMI, vous pouvez examiner de nombreuses façons différentes de mesurer la similitude entre les images: http://spl.utko.feec.vutbr.cz/en/component/content/article/46-image-processing-extension- pour-rapidminer-5
En définissant un seuil et en sélectionnant une méthode, vous pouvez mesurer la similitude.
la source