Comment puis-je mesurer la similitude entre deux images? [fermé]


94

Je voudrais comparer une capture d'écran d'une application (pourrait être une page Web) avec une capture d'écran précédemment prise pour déterminer si l'application s'affiche correctement. Je ne veux pas de comparaison de correspondance exacte, car l'aspect peut être légèrement différent (dans le cas d'une application Web, selon le navigateur, certains éléments peuvent être à un emplacement légèrement différent). Il devrait donner une mesure de la similitude des captures d'écran.

Y a-t-il une bibliothèque / un outil qui fait déjà cela? Comment le mettriez-vous en œuvre?


1
Il y a quelques bonnes réponses à cette autre question similaire: stackoverflow.com/questions/75891/…
blak


1
Il est temps de mettre à jour les réponses à la lumière des progrès récents de l'apprentissage automatique et plus spécifiquement du «Deep Learning».
jldupont le

Mon laboratoire devait également résoudre ce problème et a utilisé le flux de travail décrit ici: douglasduhaime.com/posts/…
duhaime

Réponses:


73

Cela dépend entièrement de la façon dont vous voulez que l'algorithme soit intelligent.

Par exemple, voici quelques problèmes:

  • images recadrées vs image non recadrée
  • images avec un texte ajouté par rapport à une autre sans
  • images en miroir

L' algorithme le plus simple et le plus simple que j'ai vu pour cela consiste simplement à suivre les étapes suivantes pour chaque image:

  1. mettre à l'échelle à quelque chose de petit, comme 64x64 ou 32x32, ne pas tenir compte du rapport hauteur / largeur, utiliser un algorithme de mise à l'échelle de combinaison au lieu du pixel le plus proche
  2. mettre à l'échelle les gammes de couleurs pour que le plus sombre soit le noir et le plus clair soit le blanc
  3. faites pivoter et retournez l'image de sorte que la couleur la plus claire soit en haut à gauche, puis en haut à droite est la prochaine plus sombre, en bas à gauche est la prochaine plus sombre (dans la mesure du possible bien sûr)

Modifier un algorithme de mise à l'échelle combinant est celui qui, lors de la réduction de 10 pixels à un, le fera en utilisant une fonction qui prend la couleur de tous ces 10 pixels et les combine en un seul. Peut être fait avec des algorithmes tels que la moyenne, la valeur moyenne ou des algorithmes plus complexes comme les splines bicubiques.

Calculez ensuite la distance moyenne pixel par pixel entre les deux images.

Pour rechercher une correspondance possible dans une base de données, stockez les couleurs de pixel sous forme de colonnes individuelles dans la base de données, indexez-en un certain nombre (mais pas toutes, sauf si vous utilisez une très petite image) et effectuez une requête qui utilise une plage pour chaque valeur de pixel, c.-à-d. chaque image où le pixel de la petite image est compris entre -5 et +5 de l'image que vous souhaitez rechercher.

C'est facile à implémenter et assez rapide à exécuter, mais bien sûr, ne gérera pas les différences les plus avancées. Pour cela, vous avez besoin d'algorithmes beaucoup plus avancés.


14
Qu'est-ce qu'un "algorithme de mise à l'échelle combinatoire"?
Gregg Lind

32

La manière «classique» de mesurer cela est de diviser l'image en un certain nombre canonique de sections (par exemple une grille de 10x10), puis de calculer un histogramme des valeurs RVB à l'intérieur de chaque cellule et de comparer les histogrammes correspondants. Ce type d'algorithme est préféré en raison à la fois de sa simplicité et de son invariance à la mise à l'échelle et à la (petite!) Traduction.


6
N'est-ce pas similaire à faire un histogramme unique pour l'image entière, mais avec les inconvénients supplémentaires de ne pas être résiliant pour refléter et pivoter?
dodgy_coder

2 histogrammes de 2 moitiés d'image auront une meilleure précision de correspondance qu'un histogramme d'un tout. Bien que cela présente des inconvénients que vous avez mentionnés, cela dépend du problème que vous résolvez.
psycho brm

25

Utilisez un histogramme de couleur normalisé. (Lisez la section sur les applications ici ), ils sont couramment utilisés dans les systèmes de récupération / correspondance d'images et constituent un moyen standard de mise en correspondance d'images très fiable, relativement rapide et très facile à mettre en œuvre.

Essentiellement, un histogramme de couleur capturera la distribution des couleurs de l'image. Cela peut ensuite être comparé à une autre image pour voir si les distributions de couleurs correspondent.

Ce type de correspondance est assez résistant à la mise à l'échelle (une fois l'histogramme normalisé), à la rotation / au décalage / au mouvement, etc.

Évitez les comparaisons pixel par pixel, car si l'image est légèrement pivotée / décalée, cela peut entraîner une grande différence.

Les histogrammes seraient simples à générer vous-même (en supposant que vous puissiez accéder aux valeurs de pixels), mais si vous n'en avez pas envie, la bibliothèque OpenCV est une excellente ressource pour faire ce genre de choses. Voici une présentation PowerPoint qui vous montre comment créer un histogramme à l'aide d'OpenCV.


14

Les algorithmes d'encodage vidéo comme MPEG ne calculent-ils pas la différence entre chaque image d'une vidéo pour pouvoir simplement encoder le delta? Vous pouvez examiner comment les algorithmes d'encodage vidéo calculent ces différences d'images.

Regardez cette application de recherche d'images open source http://www.semanticmetadata.net/lire/ . Il décrit plusieurs algorithmes de similarité d'image, dont trois proviennent de la norme MPEG-7: ScalableColor, ColorLayout, EdgeHistogram et Auto Color Correlogram.


1
Cela ne répondrait pas à la question ici. La question ne concerne pas la comparaison pixel par pixel.
Kousha

@Kousha True, mais toujours une direction intéressante pour la réflexion.
sens-questions

13

Vous pouvez utiliser une approche purement mathématique de O(n^2), mais cela ne sera utile que si vous êtes certain qu'il n'y a pas de décalage ou quelque chose comme ça. (Bien que si vous avez quelques objets avec une coloration homogène, cela fonctionnera toujours assez bien.)

Quoi qu'il en soit, l'idée est de calculer le produit scalaire normalisé des deux matrices. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Cette formule est en fait le "cosinus" de l'angle entre les matrices (wierd). Plus la similitude (disons Pij=Qij) est grande, C sera 1, et si elles sont complètement différentes, disons pour chaque i,j Qij = 1(en évitant la division zéro) Pij = 255, alors pour la taille nxn, plus grande nsera, plus nous serons proches de zéro avoir. (Par calcul approximatif :) C=1/n^2.



7

Une solution rubis peut être trouvée ici

Depuis le readme:

Phashion est un wrapper Ruby autour de la bibliothèque pHash, "hachage perceptif", qui détecte les fichiers multimédias en double et presque dupliqués


5

La façon de mesurer la similitude entre deux images dépend entièrement de ce que vous souhaitez mesurer, par exemple: contraste, luminosité, modalité, bruit ... puis choisissez la meilleure mesure de similitude qui vous convient. Vous pouvez choisir entre MAD (différence absolue moyenne), MSD (différence quadratique moyenne) qui sont bons pour mesurer la luminosité ... il existe également un CR (coefficient de corrélation) qui est bon pour représenter la corrélation entre deux images. Vous pouvez également choisir parmi des mesures de similarité basées sur un histogramme telles que SDH (écart-type de l'histogramme d'image de différence) ou des mesures de similitude multimodale comme MI (information mutuelle) ou NMI (information mutuelle normalisée).

Étant donné que ces mesures de similitude coûtent beaucoup de temps, il est conseillé de réduire les images avant d'appliquer ces mesures.


4

Je me demande (et je ne fais que lancer l'idée là-bas pour être abattu) si quelque chose pourrait être dérivé en soustrayant une image de l'autre, puis en compressant l'image résultante en tant que jpeg de gif, et en prenant la taille du fichier comme une mesure de similitude.

Si vous aviez deux images identiques, vous obtiendrez une boîte blanche, qui se compresserait très bien. Plus les images différaient, plus il serait complexe à représenter, et donc moins compressible.

Probablement pas un test idéal, et probablement beaucoup plus lent que nécessaire, mais cela pourrait fonctionner comme une implémentation rapide et sale.


Pensez à une rotation de 90 degrés; les images sont toujours similaires.
sens-questions


2

Eh bien, pas pour répondre directement à votre question, mais j'ai vu cela arriver. Microsoft a récemment lancé un outil appelé PhotoSynth qui fait quelque chose de très similaire pour déterminer les zones qui se chevauchent dans un grand nombre d'images (qui peuvent être de différents rapports hauteur / largeur).

Je me demande s'ils ont des bibliothèques ou des extraits de code disponibles sur leur blog.


1
Cette technologie. n'est plus en production.
Joseph Rosson


2

Il existe un logiciel de récupération d'images basée sur le contenu, qui fait (partiellement) ce dont vous avez besoin. Toutes les références et explications sont liées à partir du site du projet et il y a aussi un petit manuel (Kindle): LIRE


1

Vous pouvez utiliser Siamese Network pour voir si les deux images sont similaires ou différentes en suivant ce tutoriel . Ce didacticiel regroupe les images similaires tandis que vous pouvez utiliser la L2distance pour mesurer la similitude de deux images.


0

Si c'est quelque chose que vous ferez de temps en temps et que vous n'avez pas besoin d'automatiser, vous pouvez le faire dans un éditeur d'image prenant en charge les calques, comme Photoshop ou Paint Shop Pro (probablement GIMP ou Paint.Net aussi, mais je '' Je ne suis pas sûr de ceux-ci). Ouvrez les deux captures d'écran et placez-en une sous forme de calque au-dessus de l'autre. Changez le mode de fusion des calques sur Différence, et tout ce qui est identique entre les deux deviendra noir. Vous pouvez déplacer le calque supérieur pour minimiser les différences d'alignement.


Un autre outil qui rend ce type de différence très simple est kaleidoscopeapp.com
Michael Osofsky


-1

Eh bien, une méthode vraiment de base à utiliser pourrait passer par chaque couleur de pixel et la comparer avec la couleur de pixel correspondante sur la deuxième image - mais c'est probablement une solution très très lente.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.