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?

Antoine Aubry
la source
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.

Lasse V. Karlsen
la source
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.

Louis Brandy
la source
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.

Lehane
la source
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.

Marque B
la source
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.

Shachar
la source
8

Vous aurez besoin d' une reconnaissance de formes pour cela. Pour déterminer les petites différences entre deux images, les réseaux de Hopfield fonctionnent assez bien et sont assez faciles à implémenter. Cependant, je ne connais aucune implémentation disponible.

Konrad Rudolph
la source
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

edk750
la source
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.

Gregor Simončič
la source
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.

Matt Sheppard
la source
Pensez à une rotation de 90 degrés; les images sont toujours similaires.
sens-questions
3

Vous pouvez regarder le code de l'outil open source findimagedupes , bien qu'il semble avoir été écrit en perl, donc je ne peux pas dire à quel point il sera facile d'analyser ...

En lisant la page findimagedupes qui m'a plu, je vois qu'il existe une implémentation C ++ du même algorithme . Cela sera probablement plus facile à comprendre.

Et il semble que vous puissiez également utiliser gqview .

dmckee --- chaton ex-modérateur
la source
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.

Vaibhav
la source
1
Cette technologie. n'est plus en production.
Joseph Rosson
2

pour développer la note de Vaibhav , hugin est un 'autostitcher' open source qui devrait avoir un aperçu du problème.

à domicile
la source
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

Mathias
la source
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.

cpwah
la source
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.

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

Beyond Compare a une comparaison pixel par pixel pour les images, par exemple,

entrez la description de l'image ici

emallove
la source
@xilpex, l'OP demande: y a-t-il une bibliothèque / un outil qui fait déjà cela ? Ma réponse comprend un lien vers une telle bibliothèque / outil.
emallove le
-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.

Ross
la source