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

je voudrais comparer une capture d'écran d'une application (peut être une page Web) avec une déjà pris de capture d'écran pour déterminer si l'application affiche correctement. Je ne veux pas une correspondance exacte de comparaison, parce que l'aspect pourrait être légèrement différente (dans le cas d'une application Web, selon le navigateur, certains éléments pourraient être légèrement différent de l'emplacement). Il devrait donner une mesure de similarité sont les captures d'écran.

est - il un bibliothèque / outil déjà fait? Comment voulez-vous mettre en œuvre?

81
demandé sur Luke Quinane 2008-08-25 16:51:49

17 réponses

cela dépend entièrement de l'intelligence de l'algorithme.

par exemple, voici quelques questions:

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

le plus simple et le plus simple algorithme j'ai vu pour cela est juste de faire les étapes suivantes à chaque image:

  1. échelle à quelque chose de petit, comme ou 32x32, 64x64, le non respect du ratio d'aspect, l'utilisation d'une combinaison de mise à l'échelle de l'algorithme au lieu de pixel le plus proche
  2. échelle les gammes de couleurs de sorte que le plus sombre est noir et le plus clair est blanc
  3. tourner et retourner l'image de sorte que la couleur la plus légère est en haut à gauche, puis en haut à droite est ensuite plus sombre, en bas à gauche est ensuite plus sombre (dans la mesure du possible, bien sûr)

Modifier Un combinant la mise à l'échelle de l'algorithme de lors de la mise à l'échelle de 10 pixels vers le bas pour un le fera à l'aide d'une fonction qui prend la couleur de tous ceux de 10 pixels et les combine en une seule. Peut être fait avec des algorithmes comme la moyenne, la valeur moyenne, ou plus complexes comme les splines bicubiques.

calcule alors la distance moyenne pixel par pixel entre les deux images.

pour rechercher une possible match dans une base de données, stocker les couleurs de pixel comme des colonnes individuelles dans la base de données, indexer un tas d'entre eux (mais pas tous, sauf si vous utilisez une très petite image), et faire une requête qui utilise une gamme pour chaque valeur de pixel, i.e.. chaque image où le pixel dans la petite image est entre -5 et +5 de l'image que vous voulez regarder.

c'est facile à mettre en œuvre, et assez rapide à exécuter, mais bien sûr ne sera pas gérer la plupart des différences avancées. Pour cela, vous avez besoin d'algorithmes beaucoup plus avancés.

61
répondu Lasse Vågsæther Karlsen 2008-10-15 14:58:00

la façon "classique" de mesurer ceci est de diviser l'image en un certain nombre canonique de sections (disons une grille 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 de sa simplicité et de l'invariance d'échelle et (petite!) traduction.

28
répondu Louis Brandy 2008-08-25 19:18:41

utiliser un histogramme de couleur normalisé. (Lire la section sur les applications ici ), ils sont couramment utilisés dans les systèmes de récupération d'image/d'appariement et sont un moyen standard d'appariement des images qui est très fiable, relativement rapide et très facile à mettre en œuvre.

essentiellement, un histogramme en couleur saisira la répartition des couleurs de l'image. Ceci peut ensuite être comparé avec une autre image pour voir si les distributions de couleurs correspondent.

ce type d'appariement est assez résilient à l'échelle (une fois l'histogramme normalisé), et la rotation/le déplacement/le mouvement, etc.

éviter les comparaisons pixels par pixel comme si l'image était légèrement déplacée/décalée, cela peut conduire à une grande différence étant signalée.

histogrammes seraient faciles à générer vous-même (en supposant que vous pouvez obtenir l'accès aux valeurs de pixel), mais si vous ne le souhaitez pas, le OpenCV bibliothèque est une excellente ressource pour faire ce genre de choses. Ici est une présentation powerpoint qui vous montre comment créer un histogramme à l'aide d'OpenCV.

22
répondu Lehane 2008-08-27 16:53:00

vous pouvez utiliser une approche mathématique pure de O(n^2) , mais il 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 il fonctionnera encore assez bien.)

quoi qu'il en soit, l'idée est le calcul du point-produit 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 est grande (disons Pij=Qij ), C sera 1, et si elles sont complètement différentes, disons pour chaque i,j Qij = 1 (évitant la division zéro), Pij = 255 , puis pour la taille nxn , le plus grand n sera, le plus proche de zéro que nous obtiendrons. (Par approximation: C=1/n^2 ).

13
répondu Shachar 2012-11-16 11:02:16

les algorithmes d'encodage vidéo comme MPEG ne calculent-ils pas la différence entre chaque image d'une vidéo pour qu'ils puissent simplement encoder le delta? Vous pourriez regarder comment les algorithmes d'encodage vidéo calculent ces différences de cadre.

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

12
répondu Mark B 2008-09-16 20:29:32

vous aurez besoin de reconnaissance de modèle pour cela. Pour déterminer les petites différences entre deux images, Hopfield nets fonctionne assez bien et sont assez faciles à mettre en œuvre. Je ne connais aucune implémentation disponible.

8
répondu Konrad Rudolph 2008-08-25 13:00:13

une solution de rubis peut être trouvé ici

dans le readme:

Phashion est un enveloppeur de rubis autour de la bibliothèque de phash, "perceptual hash", qui détecte les fichiers multimédia dupliqués et quasi dupliqués

5
répondu edk750 2012-10-10 13:06:17

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

parce que cette similitude mesure le coût beaucoup dans le temps, il est conseillé de réduire l'échelle des images avant d'appliquer ces mesures sur eux.

4
répondu Gregor Simončič 2016-01-31 10:41:24

je me demande (et je suis vraiment juste jeter l'idée là-bas pour être abattu) si quelque chose pourrait être dérivé en soustrayant une image de l'autre, puis compresser l'image résultante comme un jpeg de gif, et de prendre la taille du fichier comme une mesure de similitude.

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

probablement pas un test idéal, et probablement beaucoup plus lent que nécessaire, mais il pourrait fonctionner comme une mise en œuvre rapide et sale.

3
répondu Matt Sheppard 2008-08-25 13:10:28

vous pourriez regarder le code pour l'outil open source findimagedupes , bien qu'il semble avoir été écrit en perl, donc je ne peux pas dire comment il sera facile de parser...

en lisant la page findimagedupes que j'ai aimé, je vois qu'il y a une implémentation C++ du même algorithme . Vraisemblablement, ce sera plus facile à comprendre.

et il semble que vous pouvez aussi utiliser gqview .

3
répondu dmckee 2017-05-06 00:52:55

Je ne veux pas répondre directement à votre question, mais j'ai vu ce qui s'est passé. Microsoft a récemment lancé un outil appelé PhotoSynth qui fait quelque chose de très similaire pour déterminer les zones de chevauchement dans un grand nombre d'images (qui pourrait être de différents rapports d'aspect).

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

2
répondu Vaibhav 2008-08-25 12:57:21

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

2
répondu hometoast 2008-08-25 13:16:33

il y a un logiciel pour la récupération d'image basée sur le contenu, qui fait (en partie) ce dont vous avez besoin. Toutes les références et explications sont liées à partir du site du projet et il ya aussi un petit livre de texte (Kindle): LIRE

2
répondu Mathias 2013-04-19 14:51:44

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

0
répondu Ross 2008-08-25 13:19:39

si c'est quelque chose que vous allez faire sur une base occasionnelle et n'a pas besoin d'automatiser, vous pouvez le faire dans un éditeur d'image qui supporte les couches, comme Photoshop ou Paint Shop Pro (probablement GIMP ou Paint.Net too, but i'm not sure about those). Ouvrez les deux captures d'écran, et mettez l'une comme couche sur l'autre. Changez le mode de mélange de couches en Différence, et tout ce qui est le même entre les deux deviendra noir. Vous pouvez déplacer la couche supérieure pour minimiser différences d'alignement.

0
répondu Mark Ransom 2008-10-15 15:15:47

vous pouvez utiliser le réseau Siamois pour voir si les deux images sont similaires ou dissemblables à la suite de ce" tutoriel . Ce tutoriel regroupe les images similaires alors que vous pouvez utiliser la distance L2 pour mesurer la similitude de deux images.

0
répondu cpwah 2017-02-27 08:53:25

au-Delà de Comparer a pixel-par-pixel de comparaison pour les images, par exemple,

enter image description here

0
répondu emallove 2017-04-26 19:57:11