J'ai besoin d'un moyen simple et rapide de comparer deux images pour la similitude. Ie Je veux obtenir une valeur élevée s'ils contiennent exactement la même chose mais peuvent avoir un arrière-plan légèrement différent et peuvent être déplacés / redimensionnés de quelques pixels.
(Plus concret, si cela compte: une image est une icône et l'autre image est une sous-zone d'une capture d'écran et je veux savoir si cette sous-zone est exactement l'icône ou non.)
J'ai OpenCV sous la main mais je ne suis toujours pas habitué.
Une possibilité à laquelle j'ai pensé jusqu'à présent: divisez les deux images en 10x10 cellules et pour chacune de ces 100 cellules, comparez l'histogramme des couleurs. Ensuite, je peux définir une valeur de seuil inventée et si la valeur que j'obtiens est supérieure à ce seuil, je suppose qu'elles sont similaires.
Je ne l'ai pas encore essayé à quel point cela fonctionne mais je suppose que ce serait assez bon. Les images sont déjà assez similaires (dans mon cas d'utilisation), je peux donc utiliser une valeur de seuil assez élevée.
Je suppose qu'il existe des dizaines d'autres solutions possibles pour cela qui fonctionneraient plus ou moins (car la tâche elle-même est assez simple car je ne veux détecter les similitudes que si elles sont vraiment très similaires). Que suggérerais-tu?
Il y a quelques questions très liées / similaires sur l'obtention d'une signature / empreinte digitale / hachage à partir d'une image:
- OpenCV / SURF Comment générer un hachage d'image / une empreinte digitale / une signature à partir des descripteurs?
- Empreinte digitale d'image pour comparer la similitude de nombreuses images
- Détection d'image quasi-dupliquée
- OpenCV: image d'empreinte digitale et comparaison avec la base de données .
- plus , plus , plus , plus , plus , plus , plus , plus
Aussi, je suis tombé sur ces implémentations qui ont de telles fonctions pour obtenir une empreinte digitale:
- pHash
- imgSeek ( GitHub repo ) (GPL) basé sur le document Fast Multiresolution Image Querying
- correspondance d'image . Très similaire à ce que je recherchais. Similaire à pHash, basé sur une signature d'image pour tout type d'image, Goldberg et al . Utilise Python et Elasticsearch.
- iqdb
- ImageHash . prend en charge pHash.
- Déduplicateur d'image (imagededup) . Prend en charge CNN, PHash, DHash, WHash, AHash.
Quelques discussions sur les hachages d'images perceptives: ici
Un peu hors sujet: il existe de nombreuses méthodes pour créer des empreintes digitales audio. MusicBrainz , un service Web qui fournit une recherche basée sur les empreintes digitales pour les chansons, a un bon aperçu dans leur wiki . Ils utilisent maintenant AcoustID . C'est pour trouver des correspondances exactes (ou presque exactes). Pour trouver des correspondances similaires (ou si vous n'avez que des extraits de code ou un bruit élevé), jetez un œil à Echoprint . Une question SO connexe est ici . Il semble donc que cela soit résolu pour l'audio. Toutes ces solutions fonctionnent assez bien.
Une question un peu plus générique sur la recherche floue en général est ici . Par exemple, il existe un hachage sensible à la localité et une recherche du plus proche voisin .
Réponses:
La capture d'écran ou l'icône peut-elle être transformée (mise à l'échelle, rotation, biais ...)? Il y a pas mal de méthodes sur ma tête qui pourraient éventuellement vous aider:
La plupart d'entre eux sont déjà implémentés dans OpenCV - voir par exemple la méthode cvMatchTemplate (utilise la correspondance d'histogramme): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html . Les détecteurs de points / zones saillants sont également disponibles - voir Détection des fonctionnalités OpenCV .
la source
Je suis confronté aux mêmes problèmes récemment, pour résoudre ce problème (algorithme simple et rapide pour comparer deux images) une fois pour toutes, je contribue un module img_hash à opencv_contrib, vous pouvez trouver les détails sur ce lien .
Le module img_hash fournit six algorithmes de hachage d'image, assez faciles à utiliser.
Exemple de codes
origine lena
flou lena
redimensionner lena
shift lena
Dans ce cas, ColorMomentHash nous donne le meilleur résultat
Avantages et inconvénients de chaque algorithme
Les performances de img_hash sont bonnes aussi
Comparaison de vitesse avec la bibliothèque PHash (100 images d'ukbench)
Si vous souhaitez connaître les seuils recommandés pour ces algorithmes, veuillez consulter cet article ( http://qtandopencv.blogspot.my/2016/06/introduction-to-image-hash-module-of.html ). Si vous souhaitez savoir comment mesurer les performances des modules img_hash (y compris la vitesse et les différentes attaques), veuillez consulter ce lien ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of -opencvimghash.html ).
la source
La capture d'écran contient-elle uniquement l'icône? Si tel est le cas, la distance L2 des deux images peut suffire. Si la distance L2 ne fonctionne pas, la prochaine étape est d'essayer quelque chose de simple et bien établi, comme: Lucas-Kanade . Ce qui, j'en suis sûr, est disponible dans OpenCV.
la source
Si vous souhaitez obtenir un index sur la similitude des deux images, je vous suggère à partir des métriques l'index SSIM. C'est plus cohérent avec l'œil humain. Voici un article à ce sujet: Indice de similarité structurelle
Il est également implémenté dans OpenCV et peut être accéléré avec GPU: OpenCV SSIM avec GPU
la source
Si vous pouvez être sûr d'avoir un alignement précis de votre modèle (l'icône) sur la région de test, alors toute ancienne somme de différences de pixels fonctionnera.
Si l'alignement ne sera qu'un tout petit peu décalé, vous pouvez passer les deux images par le bas avec cv :: GaussianBlur avant de trouver la somme des différences de pixels.
Si la qualité de l'alignement est potentiellement mauvaise, je recommanderais soit un histogramme des dégradés orientés, soit l'un des algorithmes pratiques de détection / descripteur de points clés d'OpenCV (tels que SIFT ou SURF ).
la source
Si pour faire correspondre des images identiques - code pour la distance L2
Vite. Mais pas robuste aux changements d'éclairage / de point de vue, etc. Source
la source
Si vous souhaitez comparer l'image pour la similitude, je vous suggère d'utiliser OpenCV. Dans OpenCV, il y a peu de correspondance de fonctionnalités et de correspondance de modèles. Pour la correspondance des fonctionnalités, il existe des détecteurs SURF, SIFT, FAST, etc. Vous pouvez l'utiliser pour détecter, décrire et faire correspondre l'image. Après cela, vous pouvez utiliser l'index spécifique pour trouver le nombre de correspondance entre les deux images.
la source