Vergleichen von Bildern mit unterschiedlichen Auflösungen

8

Können zwei Bilder mit unterschiedlichen Auflösungen verglichen werden?

Ich meine hier einen Algorithmus / Programmieransatz. Zum Beispiel berechne ich nun Hash-Code aus dem Byte-Array des Bildes und vergleiche diese Hash-Code-Werte. Das ist eine großartige Arbeit, die aber bei unterschiedlichen Auflösungen fehlschlägt, d. H. Bilder sind identisch nach Augenmaß , unterscheiden sich jedoch in ihrem Byte-Inhalt.

Sehen Sie sich zum Beispiel mein Bild an:

Eines davon hat 72 ppi , aber ein anderes 96 ppi . Ich hätte gerne TRUE Wert beim Vergleich auf Gleichheit, aber jetzt bekomme ich FALSE . Helfen Sie bitte, hier die richtige Lösung zu finden.

    
Michael Z 14.04.2012, 15:07
quelle

2 Antworten

5

Zwei sehr einfache Wahrnehmungs-Hashing-Methoden, die Sie ausprobieren sollten, bevor Sie sich in ein komplizierteres Gebiet wagen, basieren auf der diskreten Cosinus-Transformation und dem lokalen vs. glokalen Mittelwert eines Bildes:

  1. Bild in Graustufen umwandeln

    1.1 (EDIT) Machen Sie Ihr Bild Null bedeutet

  2. Zerkleinere dein Bild auf die Miniaturgröße, zB [32x32]
  3. Führen Sie die zweidimensionale diskrete Kosinustransformation
  4. aus
  5. Behalten Sie oben links [8 x 8] die wichtigsten niederfrequenten Komponenten
  6. Binarisieren Sie den Block basierend auf dem Vorzeichen der Komponenten
  7. Ergebnis ist ein 64-Bit-Hash

Und eine Variante zu diesem Thema wäre

  1. Bild in Graustufen umwandeln
  2. Optional kann die Größe auf eine vordefinierte Größe angepasst werden.
  3. Partitionieren Sie das Bild in einer festen Anzahl von Blöcken
  4. Bestimmen Sie den globalen Mittelwert
  5. Ermitteln Sie den lokalen Mittelwert pro Block
  6. Schreibe für den Hash eine 1 oder 0 pro Block aus, ausstehend wenn der lokale Mittelwert war größer oder kleiner als der globale Mittelwert.

Sehen Sie sich auch phash an.

    
Maurits 14.04.2012, 17:47
quelle
3

Für synthetische Bilder mit einigen verschiedenen Farben würde ich mit der Histogrammanpassung beginnen.

Grundsätzlich addieren Sie die Anzahl der Pixel jeder Farbe in jedem Bild und dividieren Sie durch die Gesamtzahl der Pixel. Dann haben Sie einen einfachen Float-Vektor als Fingerabdruck. Sie können Weiß ignorieren, wenn Sie möchten, dass Bilder mit mehr oder weniger Rahmen als Übereinstimmung gelten.

Es wird nicht das gleiche Bild mit den neu arrangierten Slices erkennen, oder der Text wird um eine Zeile nach unten verschoben, aber ich denke nicht, dass das in diesem Fall das Problem ist.

    
Martin Beckett 14.04.2012 15:26
quelle