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?
algorithm
language-agnostic
image
image-processing
Antoine Aubry
la source
la source
Réponses:
Cela dépend entièrement de la façon dont vous voulez que l'algorithme soit intelligent.
Par exemple, voici quelques problèmes:
L' algorithme le plus simple et le plus simple que j'ai vu pour cela consiste simplement à suivre les étapes suivantes pour chaque image:
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.
la source
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.
la source
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.
la source
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.
la source
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 chaquei,j Qij = 1
(en évitant la division zéro)Pij = 255
, alors pour la taillenxn
, plus granden
sera, plus nous serons proches de zéro avoir. (Par calcul approximatif :)C=1/n^2
.la source
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.
la source
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
la source
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.
la source
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.
la source
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 .
la source
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.
la source
pour développer la note de Vaibhav , hugin est un 'autostitcher' open source qui devrait avoir un aperçu du problème.
la source
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
la source
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
L2
distance pour mesurer la similitude de deux images.la source
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.
la source
Beyond Compare a une comparaison pixel par pixel pour les images, par exemple,
la source
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.
la source