J'ai deux images différentes:
et
Comme vous pouvez le voir, les deux sont clairement les "mêmes" d'un point de vue humain. Maintenant, je veux détecter par programme qu'ils sont les mêmes. J'utilise la magie de l'image via la gemme rubis appelée rmagick
ainsi:
img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first
img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first
if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images
puts "they are the same!!!"
end
Bien que cela fonctionne bien pour les images qui ont le même rapport / recadrage, ce n'est pas idéal lorsqu'elles ont un recadrage légèrement différent et qu'elles ont été redimensionnées à la même largeur.
Existe-t-il un moyen de le faire pour des images avec un recadrage différent? Je suis intéressé par une solution où je peux dire quelque chose comme: Une image est contenue à l'intérieur de l'autre et couvre quelque part par exemple 90% de celle-ci.
PS. Je peux obtenir les images en plus haute résolution si cela aide (par exemple le double)
la source
compare
outil de ligne de commande d'ImageMagick a un-subimage-search
commutateur.Réponses:
Vous voudrez peut-être jeter un œil à la correspondance des fonctionnalités. L'idée est de trouver des fonctionnalités dans deux images et de les faire correspondre. Cette méthode est couramment utilisée pour trouver un modèle (par exemple un logo) dans une autre image. Une caractéristique, en substance, peut être décrite comme des choses que les humains trouveraient intéressantes dans une image, comme des coins ou des espaces ouverts. Il existe de nombreux types de techniques de détection de fonctionnalités, mais ma recommandation est d'utiliser une transformation de caractéristique invariante à l'échelle (SIFT) comme algorithme de détection de fonctionnalité. SIFT est invariant à la translation d'image, à l'échelle, à la rotation, partiellement invariant aux changements d'éclairage et robuste à la distorsion géométrique locale. Cela semble correspondre à vos spécifications où les images peuvent avoir des rapports légèrement différents.
Compte tenu des deux images que vous avez fournies, voici une tentative de faire correspondre les fonctionnalités à l'aide de l' outil de mise en correspondance des fonctionnalités FLANN . Pour déterminer si les deux images sont identiques, nous pouvons la baser sur un certain seuil prédéterminé qui suit le nombre de correspondances qui réussissent le test de rapport décrit dans Caractéristiques distinctives de l'image à partir de points clés invariants à l'échelle par David G. Lowe . Une explication simple du test est que le test de rapport vérifie si les correspondances sont ambiguës et doivent être supprimées, vous pouvez le traiter comme une technique de suppression des valeurs aberrantes. Nous pouvons compter le nombre de correspondances qui réussissent ce test pour déterminer si les deux images sont identiques. Voici les résultats de correspondance des fonctionnalités:
Les points représentent toutes les correspondances détectées tandis que les lignes vertes représentent les «bonnes correspondances» qui réussissent le test de rapport. Si vous n'utilisez pas le test de rapport, tous les points seront tirés. De cette façon, vous pouvez utiliser ce filtre comme seuil pour ne conserver que les fonctionnalités les mieux adaptées.
Je l'ai implémenté en Python, je ne connais pas très bien Rails. En espérant que ça aide, bonne chance!
Code
la source
Parce que ImageMagick est très ancien, avancé et un outil à nombreuses fonctionnalités, il serait difficile de construire une interface qui couvre la plupart des fonctionnalités. Aussi formidable soit-il, rmagick ne (et les nombreuses tentatives que Python a effectuées) ne sont pas proches de couvrir toutes les fonctionnalités.
J'imagine que pour de nombreux cas d'utilisation, il sera suffisamment sûr et beaucoup plus facile d'exécuter simplement une méthode de ligne de commande et de lire à partir de cela. En rubis, cela ressemblera à ceci;
Je vais couvrir des choses importantes et parler ensuite de notes supplémentaires.
La commande utilise magick compare pour vérifier si la deuxième image (
small
) est une sous-image de la première (large
). Cette fonction ne vérifie pas que petit est strictement plus petit que grand (à la fois en hauteur et en largeur). Le nombre que j'ai mis pour la similitude est 0,2 (erreur de 20%), et la valeur des images que vous avez fournies est d'environ 0,15. Vous voudrez peut-être affiner cela! Je trouve que les images qui sont un sous-ensemble strict obtiennent moins de 0,01.stderr
etstdout
n'est pas "nécessaire" mais vous êtes censé le faire.la source
Obtenez l'histogramme des deux images et comparez-les. Cela fonctionnerait très bien pour le recadrage et le zoom, sauf en cas de changement trop radical à cause de ceux-ci.
C'est mieux que l'approche actuelle où vous soustrayez directement les images. Mais cette approche en a encore peu.
la source
Habituellement , la mise en correspondance des modèles a un bon résultat dans ces situations. La mise en correspondance de modèles est une technique permettant de trouver des zones d'une image qui correspondent (sont similaires) à une image de modèle (deuxième image). Cet algorithme donne un score pour la meilleure position macthed dans l'image source (la seconde).
En opencv en utilisant TM_CCOEFF_NORMED méthode , donne le score entre 0 et 1. Si le score est 1, cela signifie que l'image modèle est exactement une partie (Rect) de l'image source, mais si vous avez un petit changement dans l'éclaircissement ou la perspective entre les deux images, le score serait inférieur à 1.
Maintenant En considérant un seuil pour le score de similitude, vous pouvez savoir s'ils sont identiques ou non. Ce seuil peut être obtenu par quelques essais et erreurs sur quelques exemples d'images. J'ai essayé vos images et obtenu le score de 0,823863 . Voici le code (opencv C ++) et l'espace commun entre les deux images, obtenu par l'appariement:
la source
Considérez la méthode find_similar_region . Utilisez la plus petite des deux images comme image cible. Essayez différentes valeurs pour les attributs fuzz sur l'image et l'image cible.
la source