web-dev-qa-db-fra.com

Comment puis-je détecter que deux images sont «identiques» même si l'une d'entre elles a un rapport de recadrage / ratio légèrement différent?

J'ai deux images différentes:

en 100px avec enter image description here ou 400px enter image description here

et

en largeur 100px enter image description here ou 400px enter image description here

Comme vous pouvez le voir, les deux sont clairement "identiques" d'un point de vue humain. Maintenant, je veux détecter par programme qu'ils sont identiques. J'utilise la magie d'image via le Ruby gem appelé rmagick comme ceci:

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 ont été redimensionnées à la même largeur.

Existe-t-il un moyen de le faire pour les images avec un recadrage différent? Je suis intéressé par une solution où je peux dire quelque chose comme: Une image est contenue dans l'autre et couvre quelque part autour, par exemple. 90% d'entre eux.

PS. Je peux obtenir les images dans une résolution plus élevée si cela aide (par exemple, le double)

11
Niels Kristian

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.

2
An RMagick User