Question

Je suis en train de construire un script pour passer par mes photos originales, haute résolution et remplacer les anciens, les basse résolution I transférées sur Flickr avant d'avoir un compte pro.

Pour beaucoup d'entre eux je peux simplement utiliser les informations Exif telles que la date prise pour déterminer un match. Mais certains sont vraiment vieux, et soit le fichier original ne pas d'informations Exif, ou par tout a été dépassé logiciel Redimensionnement stupide je à l'époque.

Alors, incapable de compter sur les métadonnées, je suis obligé de recourir au contenu lui-même. Le problème est que les originaux sont dans différentes résolutions que celles sur Flickr (ce qui est le point de l'ensemble de cette entreprise). Alors, est-il un moyen pour moi de les comparer avec une sorte de mesure de similarité floue qui me permettrait de fixer un seuil pour exiger une intervention humaine ou non?

Je suppose que l'image est une sachant une version redimensionnée de l'autre peut donner de meilleurs résultats que la similarité générale. Une solution dans toutes les langues fera, mais Ruby serait un plus:)

Était-ce utile?

La solution

Problème intéressant, d'ailleurs:)

Solution lente ish - excellente chance de succès

Utilisez un détecteur de fonction échelle invariante pour trouver des caractéristiques correspondantes dans les deux images. Si les caractéristiques sont jumelés avec un score élevé à des endroits similaires, alors vous avez votre match.

Je vous recommande EIPD qui génère une échelle et la rotation invariant descripteur 128 entier pour une fonction trouvé dans une image. SURF (disponible en OpenCV) est un autre (plus rapide) détecteur de point caractéristique.

Vous pouvez faire correspondre les caractéristiques à travers deux images via bruteforce (comparer chaque descripteur à un descripteur dans l'autre image) qui est O (n ^ 2), mais très vite (en particulier dans la mise en œuvre EIPD VL). Mais si vous avez besoin de comparer les caractéristiques dans une image à plusieurs images (que vous pourriez avoir à) vous devez construire un arbre des fonctionnalités pour l'interroger avec les caractéristiques de l'autre image. arbres K-D sont utiles, et OpenCV a une belle mise en œuvre.

Solution rapide - pourrait fonctionner

Sous-échantillonner votre image haute résolution aux dimensions basse résolution et d'utiliser une mesure de similarité comme SAD (où la somme des différences entre les blocs de, par exemple, 3x3 pixels autour d'un pixel dans les deux images est la moyenne des scores) pour déterminer une correspondance.

Autres conseils

Je recommande scripting une solution hors de ImageMagick. Ce qui suit (de la documentation sur comparant les images avec IM ) génèrerait une valeur comparative que vous peut utiliser.

convert image1 image2 \
        -compose difference -composite -colorspace gray miff:- |\
  identify -verbose - |\
    sed -n '/^.*Mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768/;p;q;}' | bc

Calculer la normalisée histogramme de couleurs de les images et les comparer à l'aide d'une méthode (intersection de l'histogramme, par exemple - voir le lien ci-dessus). Notez l'histogramme normalisé est nécessaire parce que les images présentent des résolutions différentes. Si les images sont si dissemblables, ils ne sont pas la même image. Mais si elles sont similaires, vous avez un de ces deux cas: (i) ils sont la même image ou (ii) elles sont différentes, mais les images présentes similaires global distributions de couleurs.

Dans le cas (ii), diviser les images et les tuiles rectangulaires et répéter le processus, en comparant les carreaux correspondants. Vous essayez de tenir compte des propriétés locales de l'image. Classer les résultats et choisir le meilleur match.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top