92 votes

Algorithme de recherche d'images similaires

J'ai besoin d'un algorithme capable de déterminer si deux images sont "similaires" et de reconnaître des modèles similaires de couleur, de luminosité, de forme, etc. J'aurais besoin d'indications sur les paramètres que le cerveau humain utilise pour "catégoriser" les images. ..

J'ai étudié la correspondance basée sur la méthode Hausdorff, mais elle semble principalement destinée à la correspondance d'objets transformés et de modèles de formes.

modifier

Merci beaucoup les gars, votre contribution devrait m'aider grandement !

0 votes

Il y a quelques bonnes réponses dans cette autre question similaire : stackoverflow.com/questions/25977/

2 votes

Beaucoup de "pourrait" et de "pourrait". Quelqu'un a essayé toutes ces suggestions et sait ce qui est le mieux ?

0 votes

Cela fait 13 ans, mais je voudrais mettre à jour ici que les vecteurs de caractéristiques d'image basés sur ML peuvent être robustes et facilement comparés à la similarité cosinus. Vous pouvez rechercher le projet img2vec ou quelque chose comme latentvector.space pour une intégration API plus facile (clause de non-responsabilité : je gère ce service).

63voto

freespace Points 9024

J'ai fait quelque chose de similaire, en décomposant les images en signatures à l'aide de transformée en ondelettes .

Mon approche a été de choisir les plus significatifs n coefficients de chaque canal transformé, et en enregistrant leur emplacement. Ceci a été fait en triant la liste des tuples (puissance, emplacement) selon abs(puissance). Des images similaires auront des points communs en ce sens qu'elles auront des coefficients significatifs aux mêmes endroits.

J'ai trouvé qu'il était préférable de transformer l'image au format YUV, qui vous permet effectivement de pondérer la similitude de forme (canal Y) et de couleur (canaux UV).

Vous pouvez trouver mon implémentation de ce qui précède dans mactorii que je n'ai malheureusement pas travaillé autant que j'aurais dû :-)

Une autre méthode, que certains de mes amis ont utilisée avec des résultats étonnamment bons, consiste simplement à redimensionner votre image à, disons, un 4x4 pixel et à la stocker comme votre signature. La similarité entre deux images peut être évaluée en calculant, par exemple, la valeur de Distance de Manhattan entre les 2 images, en utilisant les pixels correspondants. Je n'ai pas les détails de la façon dont ils ont effectué le redimensionnement, donc vous devrez peut-être jouer avec les différents algorithmes disponibles pour cette tâche afin d'en trouver un qui convienne.

7 votes

La méthode de redimensionnement en 4x4 est une idée géniale (non pas que votre méthode ne soit pas géniale aussi) mais la première est plus simple.

0 votes

@freespace, pouvez-vous expliquer ce "calcul de la distance de Manhattan entre les 2 images, en utilisant les pixels correspondants".

1 votes

@Ambika : traitez la couleur de chaque pixel comme un vecteur de longueur 3, et calculez la distance de Manhattan entre les pixels correspondants dans les images comparées. Cela vous donne 4 distances de Manhattan. C'est à vous de décider comment en déduire une mesure unique. Le plus évident est de les additionner.

48voto

Alvis Points 343

pHash pourrait vous intéresser.

hachage perceptuel : empreinte digitale d'un fichier audio, vidéo ou image, basée mathématiquement sur le contenu audio ou visuel qu'il contient. Contrairement aux fonctions de hachage cryptographiques qui reposent sur l'effet d'avalanche de petits changements en entrée entraînant des changements radicaux en sortie, les hachages perceptuels sont "proches" les uns des autres si les entrées sont visuellement ou auditivement similaires.

11 votes

Je viens de vérifier le site web de pHash. Ils ont actuellement cette fonctionnalité sur leur site qui vous permet de télécharger deux images et il vous dit si elles sont similaires ou non. J'ai essayé environ 10 images qui étaient similaires et 10 qui ne l'étaient pas. Le taux de réussite n'était pas très impressionnant, malheureusement.

3 votes

PHash est en fait assez strict, vous pouvez utiliser 'ahash' ou average hash, qui a tendance à être moins strict. Vous pouvez trouver une implémentation python ici github.com/JohannesBuchner/imagehash/blob/master/

13voto

jilles de wit Points 5207

J'ai utilisé SIFT pour re-détecter le même objet dans différentes images. C'est un outil très puissant mais assez complexe, qui peut s'avérer excessif. Si les images sont censées être assez similaires, quelques paramètres simples basés sur la différence entre les deux images peuvent vous en apprendre beaucoup. Quelques conseils :

  • Normaliser les images, c'est-à-dire rendre la luminosité moyenne des deux images identique en calculant la luminosité moyenne des deux et en réduisant la plus lumineuse en fonction du ratio (pour éviter l'écrêtage au niveau le plus élevé)), surtout si vous êtes plus intéressé par la forme que par la couleur.
  • Somme des différences de couleur sur l'image normalisée par canal.
  • trouver les bords dans les images et mesurer la distance entre les pixels des bords dans les deux images. (pour la forme)
  • Divisez les images en un ensemble de régions discrètes et comparez la couleur moyenne de chaque région.
  • Segmentez les images à un (ou un ensemble de) niveau(x) et comptez le nombre de pixels où les images noir/blanc résultantes diffèrent.

0 votes

Pouvez-vous indiquer le code qui utilise des fonctions de type sift pour calculer la similarité des images ?

0 votes

Je suis désolé, je suis sûr qu'il existe un code disponible publiquement, mais pas à ma connaissance. Il y a quelques exemples sur ce site. Par exemple ici : stackoverflow.com/questions/5461148/

0 votes

Le cadre Accord pour .Net ( accord-framework.net ) propose d'excellentes classes permettant d'utiliser SURF, BagOfVisualWords, Harris Corner Detection, etc. avec un grand nombre de noyaux et d'algorithmes de regroupement.

5voto

Alejandro Bologna Points 775

Vous pourriez utiliser Diffusion d'images perceptives

Il s'agit d'un utilitaire en ligne de commande qui compare deux images en utilisant une métrique perceptive. C'est-à-dire qu'il utilise un modèle informatique du système visuel humain pour déterminer si deux images sont visuellement différentes, de sorte que les changements mineurs de pixels sont ignorés. De plus, il réduit considérablement le nombre de faux positifs causés par des différences dans la génération de nombres aléatoires, des différences de système d'exploitation ou d'architecture de machine.

4voto

Ben Points 10335

C'est un problème difficile ! Cela dépend de la précision dont vous avez besoin et du type d'images avec lesquelles vous travaillez. Vous pouvez utiliser des histogrammes pour comparer les couleurs, mais cela ne prend évidemment pas en compte la distribution spatiale de ces couleurs dans les images (c'est-à-dire les formes). La détection des contours suivie d'une certaine forme de segmentation (c'est-à-dire l'identification des formes) peut fournir un modèle à comparer à une autre image. Vous pouvez utiliser des matrices de cooccurrence pour comparer des textures, en considérant les images comme des matrices de valeurs de pixels, et en comparant ces matrices. Il existe de bons livres sur la comparaison d'images et la vision industrielle - une recherche sur Amazon en trouvera quelques-uns.

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X