206 votes

Méthode simple et rapide pour comparer les images de similitude

J'ai besoin d'une manière simple et rapide pour comparer deux images de la similitude. I. e. Je veux obtenir une valeur élevée si elles contiennent exactement la même chose, mais peut avoir quelques fond légèrement différents et peuvent être déplacés ou redimensionnés par quelques pixels.

(De plus concret, si ce qui compte: une image est une icône et l'autre image est une sous-zone de capture d'écran et je veux savoir si cette sous-zone est exactement l'icône ou pas.)

J'ai OpenCV , mais je me suis toujours pas habitué.

Une possibilité, j'ai pensé: Diviser les deux photos en 10x10 cellules et pour chacune de ces 100 cellules, de comparer l'histogramme de couleur. Ensuite, je peux mettre quelques constitué de la valeur seuil, et si la valeur que je reçois est au-dessus de ce seuil, je suppose qu'ils sont similaires.

Je n'ai pas encore essayé de comment ça fonctionne, mais je suppose que ce serait assez bon. Les images sont déjà à peu près similaires (dans mon cas d'utilisation), donc je peux l'utiliser plutôt une haute valeur de seuil.

Je pense qu'il y a des dizaines d'autres solutions possibles pour ce qui serait plus ou moins (comme la tâche elle-même est assez simple car je ne veux détecter la similarité s'ils sont vraiment très similaires). Que suggérez-vous?


Il y a quelques très liés / questions similaires à propos de l'obtention d'une signature ou empreinte digitale/hachage à partir d'une image:

Aussi, je suis tombé sur ces implémentations qui ont de telles fonctions pour obtenir une empreinte digitale:


Un peu hors-sujet: Il existe de nombreuses méthodes pour créer des empreintes numériques. MusicBrainz, un service web qui fournit de l'empreinte de recherche pour les chansons, a un bon aperçu de leur wiki. Ils sont à l'aide de AcoustID maintenant. C'est pour la recherche exacte (ou la plupart du temps exact) matchs. Pour trouver une allumettes (ou si vous n'avez que quelques extraits ou de bruit élevé), jetez un oeil à Echoprint. Une relative DONC, la question est ici. Donc il semble que ce problème est résolu pour l'audio. Toutes ces solutions fonctionnent très bien.

Un peu plus générique question à propos de la recherche floue, en général, est ici. E. g. il est de la localité sensible de hachage et le plus proche voisin de recherche.

116voto

Karel Petranek Points 10740

Peut la capture d'écran ou l'icône d'être transformé (mise à l'échelle, rotation, incliné ...)? Il existe quelques méthodes sur le dessus de ma tête qui pourrait éventuellement vous aider:

  • Simple distance euclidienne comme mentionné par @carlosdc (ne fonctionne pas avec transforme les images et vous avez besoin d'un seuil).
  • (Normalisée) de Corrélation Croisée - des mesures simples que vous pouvez utiliser pour la comparaison des zones de l'image. Il est plus solide que la simple distance euclidienne, mais ne fonctionne pas pour la transformation des images et vous aurez à nouveau besoin d'un seuil.
  • Histogramme de comparaison - si vous utilisez la forme d'histogrammes normalisés, cette méthode fonctionne bien et n'est pas affecté par les transformations affines. Le problème est de déterminer le bon seuil. Il est également très sensible aux changements de couleur, de la luminosité, du contraste, etc.). Vous pouvez les combiner avec les deux précédents.
  • Détecteurs de points saillants/domaines - tels que MSER (au Maximum Stable Extrémal Régions), de SURF ou de TAMISER. Ceux-ci sont très algorithmes robustes et ils ont peut-être trop compliqué pour votre tâche simple. La bonne chose est que vous n'avez pas à avoir une zone précise avec une seule icône, ces détecteurs sont assez puissants pour trouver le bon match. Une belle évaluation de ces méthodes est dans ce papier: Local invariant feature détecteurs: un sondage.

La plupart de ces derniers sont déjà mis en œuvre dans OpenCV - voir par exemple l'cvMatchTemplate méthode (utilise l'histogramme correspondant): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html. Le point saillant/zone détecteurs sont également disponibles - voir OpenCV la Détection de Fonctionnalité.

11voto

carlosdc Points 7059

La capture d'écran contiennent uniquement de l'icône? Si oui, la L2 de distance des deux images pourraient suffire. Si la L2 de distance ne fonctionne pas, la prochaine étape est d'essayer quelque chose de simple et bien établies, comme: Lucas-Kanade. Qui je suis sûr est disponible dans OpenCV.

6voto

ramez Points 53

Si vous souhaitez obtenir un indice sur la similitude des deux images, je vous suggère de les paramètres de la MÉTHODE de l'indice. Il est plus cohérent avec l'œil humain. Voici un article sur le sujet: la Similarité Structurelle de l'Indice de

Il est mis en œuvre dans OpenCV trop, et il peut être accéléré par GPU: OpenCV SSIM avec GPU

5voto

Boatzart Points 1650

Si vous pouvez être sûr d'avoir un alignement précis de votre modèle (l'icône) pour les essais de la région, puis une vieille somme de pixel différences travail.

Si l'alignement est seulement va être un tout petit peu hors, alors vous pouvez passe-bas à la fois des images avec cv::GaussianBlur avant de trouver la somme des pixels différences.

Si la qualité de l'alignement est potentiellement mauvaise alors je vous recommande soit un Histogramme de Gradients Orientés ou de l'une de OpenCV pratique de tazoult de détection/descripteur algorithmes (comme EIPD ou SURF).

2voto

Tarek Mamdouh Points 31

Je recommande cette méthode La Cohérence Des Couleurs Vecteur

Cet article décrit une couleur descripteur appelé la Cohérence des Couleurs vecteur (CCV). c'est l'une des plus efficaces méthodes de Récupération d'Image (avec étapes de mise en œuvre)

Vous pourriez être intéressé de savoir plus de détails sur le Global et le Local et Histogramme de Couleur avec des étapes de mise en œuvre

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