Frage

Ich versuche, ein Skript zu bauen durch meine ursprünglichen, hochauflösende Fotos zu gehen und die alten, low-res ersetzen ich auf Flickr hochgeladen, bevor ich einen Pro-Account hatte.

Für viele von ihnen kann ich nur Exif Informationen verwenden, wie Aufnahmedatum ein Spiel zu bestimmen. Aber einige sind wirklich alt, und entweder die Originaldatei nicht über Exif-Info, oder wurde es verprügelt durch was auch immer dumm Redimensionierung Software, die ich zu der Zeit verwendet wird.

Also, nicht in der Lage auf Metadaten verlassen, ich bin auf den Inhalt selbst greifen gezwungen. Das Problem ist, dass die Originale in verschiedenen Auflösungen als die, die auf Flickr sind (das ist der ganze Sinn dieses Unterfangens ist). So gibt es eine Möglichkeit für mich, sie mit irgendeiner Art von Fuzzy-Ähnlichkeitsmaß zu vergleichen, die mir erlauben würden, einen Schwellenwert zu setzen für die Forderung menschliches Zutun oder nicht?

Ich denke, zu wissen, ein Bild wird eine Größe verändert Version der anderen kann bessere Ergebnisse als allgemeine Ähnlichkeit ergeben. Eine Lösung in jeder Sprache tun wird, aber Rubin wäre ein Pluspunkt:)

War es hilfreich?

Lösung

Interessantes Problem, btw:)

Langsam-ish Lösung - eine ausgezeichnete Chance auf Erfolg

Verwenden Sie einen skaleninvarianten Merkmalsdetektor entsprechende Merkmale in beiden Bildern zu finden. Wenn die Funktionen mit einer hohen Punktzahl an ähnlichen Stellen abgestimmt sind, dann haben Sie Ihr Spiel.

würde ich empfehlen, SIFT , die für ein Merkmal eine Skala & drehungsinvarianten 128-Integer-Descriptor erzeugt gefunden in einem Bild. SURF (erhältlich in OpenCV) ist ein weiterer (schneller) Merkmalspunktdetektor.

(Vergleiche jeden Deskriptor auf einen Deskriptor in dem anderen Bild)

Sie können Funktionen auf zwei Bilder über Brute-Force-Match, das ist O (n ^ 2), aber ziemlich schnell (vor allem in der VL-SIFT-Implementierung). Aber wenn Sie die Eigenschaften in einem Bild auf mehrere Bilder vergleichen (die Sie vielleicht müssen) Sie einen Baum der Features bauen sollte es mit dem anderen Bild-Funktionen abzufragen. K-D Bäume sind nützlich, und OpenCV hat eine schöne Umsetzung.

Schnelle Lösung - könnte funktionieren

Neuberechnung Ihres high-res Bild der niedrigen Auflösung Abmessungen und verwendet einen Ähnlichkeitsmaß wie SAD (wobei die Summe der Differenzen zwischen dem Block von beispielsweise 3x3 Pixel um ein Pixel in beiden Bildern die Partitur) ein Spiel zu bestimmen.

Andere Tipps

Ich würde empfehlen, eine Lösung scripting off von ImageMagick. Der folgende (aus der Dokumentation auf Bilder mit IM Vergleich) ausgegeben würde ein Vergleichswert, den Sie Kann benutzen.

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

Berechnen Sie die normalisiert Farbe Histogramm beide Bilder und vergleichen sie eine Methode unter Verwendung von (Histogrammschnittpunkt, zum Beispiel - siehe Link oben). Beachten Sie das normalisierte Histogramm benötigt wird, da die Bilder unterschiedliche Auflösungen darstellen. Wenn die Bilder so unähnlich sind, sind sie nicht das gleiche Bild. Aber wenn sie ähnlich sind, haben Sie eine dieser beiden Fälle: (i) sie sind das gleiche Bild oder (ii) sie sind verschiedene Bilder aber haben ähnliche global Farbverteilungen.

Für den Fall (ii) spaltete sich die Bilder und rechteckige Fliesen und wiederholen Sie den Vorgang, Korrespondent Fliesen zu vergleichen. Sie versuchen, für lokale Eigenschaften des Bildes zu berücksichtigen. Ordnen Sie die Ergebnisse und wählen Sie die beste Übereinstimmung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top