Wie kann ich hochskalierte Fotos erkennen?


8

Ich habe eine Sammlung von JPEG-Fotos mit jeweils 500 bis 600 Pixel auf der längsten Seite. Wie kann ich anhand eines wesentlich kleineren Fotos erkennen, welche algorithmisch vergrößert wurden?

Auf einem Online-Marktplatz muss jeder Verkäufer Fotos von Produkten hochladen, die er verkauft. Diese Fotos müssen mindestens 500 Pixel breit oder 500 Pixel hoch sein, da Produktfotos mit wenig Details für Käufer eine schlechte Erfahrung verursachen. Ich kann bereits erkennen, ob ein Verkäufer versucht, diese Anforderung zu umgehen, indem er einen einfarbigen Rand hinzufügt, z. B. indem der weiße Standardhintergrund um mehr Weiß erweitert wird. In letzter Zeit haben Verkäufer begonnen, dies zu umgehen, indem sie alte Fotos, die vor der Veröffentlichung der 500-Pixel-Anforderung aufgenommen wurden, hochskaliert haben. Was ist ein guter Weg, um festzustellen, ob Fotos durch Interpolation mit dem nächsten Nachbarn, bilinear oder bikubisch vergrößert wurden?


Fragen Sie zur Verdeutlichung nach einer vollständig automatisierten Erkennung ohne Bewertung durch menschliche Augäpfel?
Junkyardsparkle

4
Für einen automatisierten Test gibt Stackoverflow eher eine Antwort
Renan Le Caro

@Renan Sogar ein manueller Test mit einer Folge von GIMP-Filtern könnte für eine Stichprobe der Bilder eines bestimmten Verkäufers funktionieren.
Damian Yerrick

1
Ich denke, die Frage, die wir stellen müssen, ist, warum es dich interessiert. Es macht einen großen Unterschied zur Antwort ...
James Snell

@ JamesSnell Schlechte Fotos stoßen Käufer ab. Siehe zum Beispiel die Anleitung von eBay .
Damian Yerrick

Antworten:


9

Lassen Sie einen HUND die Fotos verwischen.

Wenn Sie für digital vergrößerte Fotos eine Strafe erhalten, können Sie auch für unscharfe Fotos eine Strafe verhängen. Die unscharfen Kanten und Details in beiden verursachen für den Betrachter das gleiche schlechte Erlebnis, unabhängig davon, ob es sich um ein kleines Original oder einen schlechten Fokus handelt. Was Sie tun möchten, ist die Erkennung von Unschärfe, bei der keine hohen Ortsfrequenzen vorhanden sind.

Versuchen Sie, den Unterschied zwischen einem Bild und einer unscharfen Kopie von sich selbst zu erkennen. Wenn ein Bild bereits verschwommen ist, ändert eine 1-Pixel-Gaußsche Unschärfe das Bild nicht so stark, als ob das Bild scharf wäre. Es gibt also mehr Unterschiede zwischen einem scharfen Bild und einer unscharfen Version als zwischen einem verschwommenen Bild und einer weiteren unscharfen Version. In der Bildverarbeitung wird diese Technik als " Differenz der Gaußschen " (DOG) bezeichnet.

  1. Öffnen Sie das Bild in GIMP oder einem anderen Bildeditor mit mehreren Ebenen.
  2. Dupliziere die Ebene.
  3. Wenden Sie eine Gaußsche Unschärfe mit einem Radius von 1 Pixel auf diese neue Ebene an.
  4. Ändern Sie den Ebenenmodus auf "Differenz". Das Bild wird bis auf die Kanten schwarz.
  5. Wiederholen Sie die Schritte 1 bis 4, um ein bekanntes scharfes Bild mit ähnlichem Motiv, ähnlicher Zusammensetzung und Größe zu erhalten.
  6. Vergleichen Sie die Intensität der Kanten in den beiden Differenzbildern. Sie können dies beobachten oder ein Histogramm verwenden.

Ich habe dies gerade bei einem Foto mit 400 x 480 Pixeln versucht und bei demselben Foto, das auf 200 x 240 (50%) verkleinert und dann wieder auf 400 x 480 (200%) vergrößert wurde, und die Kanten auf dem hochskalierten Foto waren merklich schwächer. Bei einer leichten Vergrößerung wie 140% ist dies nicht schlüssig, aber es werden offensichtliche Fälle erfasst.

Mehrere Computer-Vision-Bibliotheken enthalten Mittel zum Berechnen der Differenz von Gaußschen auf einem Bild. So auch viele grafische Bildbearbeitungsprogramme. Zum Beispiel aktuelle Versionen von GIMP. Fügen Sie ein DOG-Makro hinzu , das die Schritte 2 bis 4 automatisiert: Filter> Kantenerkennung> Differenz der Gaußschen, und setzen Sie dann die Radien auf 1,0 und 0,0.

Verwandte Fragen zu anderen Stack Exchange-Sites:

DOG fängt den nächsten Nachbarn nicht, aber Sie können dies tun, indem Sie nach einem Muster aus Zeilen und Spalten suchen, die mit dem unmittelbaren Nachbarn oben oder links identisch sind.

  1. Öffnen Sie das Bild.
  2. Dupliziere die Ebene.
  3. Versetzen Sie die neue Ebene um ein Pixel nach oben oder links.
  4. Ändern Sie den Ebenenmodus auf "Differenz".
  5. Suchen Sie nach einem Muster aus leeren Linien.

1
Was ist, wenn auf das hochskalierte Bild eine wirklich starke unscharfe Maske angewendet wird?
Bitte lesen Sie mein Profil

1
Die unscharfe @ mattdm-Maske erhöht den Kontrast und erzeugt keinen hochfrequenten Bildinhalt.
Matt Grum

@mattdm USM ist ein High-Boost-Filter : x + amt*(x - GB(x, r)). Durch die Kombination von USM und Vergrößerung werden nur die Mitten (mittlere räumliche Frequenzen) und nicht die Höhen angehoben, da die Höhen nicht existieren. DOG (x, 1, 0) isoliert die Höhen.
Damian Yerrick

1

Ich weiß nicht, dass dies im allgemeinen Sinne möglich ist. Es gibt viele mögliche Upscaling-Algorithmen mit einer Signatur, die ohne Kenntnis des Bildinhalts möglicherweise nur schwer eindeutig zu erkennen ist (als extremes Beispiel ist ein hochskalierter Bereich mit einheitlicher Farbe immer noch einheitliche Farbe ...).

Möglicherweise besteht eine Option darin, eine Metrik für die Bildkomplexität zu berechnen, z. B. eine Entropieschätzung (siehe z. B. /programming/4935380/get-or-calculate-the-entropy-of-an-image-with -ruby-and-imagemagick ).

Wenn Sie dies über eine große Anzahl von Bildern tun, können Sie Statistiken für die gesamte Sammlung erstellen. Sie können dann Bilder, die Ausreißer in diesen Statistiken sind, manuell überprüfen.

Leider führt dies immer zu Fehlalarmen, und Bilder, die gut skaliert wurden, werden möglicherweise nicht erfasst (aber wenn sie gut sind, spielt es dann eine Rolle?)


Ich mag den letzten Teil - wenn niemand sagen kann, wen interessiert das? Erinnert mich an diese Xkcd . (Warnung: starke Sprache.)
Bitte lesen Sie mein Profil

0

Ich würde einen hybriden Ansatz verfolgen. Ich denke, die anderen Ideen, einen Unterschied von Gaußschen zu verwenden, EXIF ​​oder andere Metadaten oder sogar FFT zu überprüfen, können kombiniert werden. Eine andere möglicherweise einfachere Möglichkeit besteht darin, jedes Bild einfach aufzunehmen, zu verkleinern, erneut zu skalieren und zu vergleichen. Wenn sie sich sehr ähnlich sind ( vielleicht mit Delta E ), ist es wahrscheinlich, dass sie hochskaliert wurden (oder verschwommen sind, wie ein anderer Beitrag vorschlägt). Vielleicht könnten Sie einen Schwellenwert für die Anzahl der bestandenen oder nicht bestandenen Tests festlegen? Wenn mehr als die Hälfte der Tests bestanden ist, ist es gut, andernfalls ist es schlecht oder erfordert menschliches Eingreifen, um dies zu überprüfen, oder so ähnlich.


0

Sie sollten in der Lage sein, gute Arbeit zu leisten, indem Sie die JPEG-Daten selbst teilweise entpacken und einige einfache Zählungen durchführen.

JPEG-Daten werden erstellt, indem eine diskrete Kosinustransformation der ursprünglichen Bilddaten durchgeführt, quantisiert (die hochauflösenden Daten weggeworfen), dann der resultierende DCT-Block in einem Zick-Zack-Muster durchlaufen und der resultierende Bitstrom mit Huffman-Codierung gepackt wird.

Wenn Sie die Huffman-Codierung umkehren und den Zickzack rückgängig machen, erhalten Sie eine Reihe von 8x8-DCT-Blöcken, in denen sich die Daten mit der niedrigsten Frequenz in der oberen linken Ecke des Blocks und die Informationen mit der höchsten Frequenz in der unteren rechten Ecke befinden.

Das bedeutet, dass Sie buchstäblich einen Blick auf die Daten in diesem Zwischenformat werfen und feststellen können, ob sie hochgesampelt wurden, da alle 8x8-Blöcke nur in der oberen linken Ecke (ungefähr) Werte ungleich Null haben.


0

Eigentlich kannst du

Sie brauchen keinen Hund, um das Bild zu schnüffeln. Gehe zu:

http://rest7.com/image_upscaled

Auf dieser Seite können Sie Ihr Bild hochladen und erhalten Originalabmessungen wie folgt :

{
  "is_upscaled": true,
  "current_width": "2000",
  "current_height": "928",
  "original_width": "1750",
  "original_height": "696",
  "accuracy": "82%",
  "accuracy_width": "82%",
  "accuracy_height": "82%",
  "success": 1
}

Manchmal wird die ursprüngliche Auflösung nicht richtig erraten. Ich denke, es hängt davon ab, welcher Upscaling-Algorithmus auf dem Foto verwendet wurde. Außerdem stellte ich fest, dass die JPEG-Artefakte das Erraten dieser Seite erschweren, wenn ein Foto hochskaliert und dann in ein JPEG-Format mit starker Komprimierung (z. B. 30%) komprimiert wurde. Wenn Ihre Fotos jedoch von guter Qualität sind und mit gängigen Methoden (Lanczos, Bilinear) hochskaliert wurden, sollten sie recht genau sein.

Hier sind 2 Beispielbilder:

ORIGINAL

https: // i. Stapel. imgur. com / iXYKV.png

(Entschuldigung, ich habe nicht genug Ruf, um mehr als 2 Links zu posten.)

UPSCALED & CROPPED

Geben Sie hier die Bildbeschreibung ein

Wenn Sie das zugeschnittene Foto veröffentlichen, wird auf dieser Seite Folgendes zurückgegeben:

{
  "is_upscaled": true,
  "current_width": "700",
  "current_height": "300",
  "original_width": 352.33333333333,
  "original_height": 151,
  "accuracy": "57%",
  "accuracy_width": "57%",
  "accuracy_height": "57%",
  "cropped": true,
  "success": 1
}

Sie können also sehen, dass das Bild vergrößert und beschnitten wurde. Vor dem Zuschneiden wird die Größe des Originalbilds nicht angezeigt, da es einfach nicht möglich ist, Informationen zu etwas zu erhalten, das nur aus den intakten Pixeln gelöscht wurde.


Diese Site funktioniert nur, solange Sie den im Bild eingebetteten Daten vertrauen können. Es ist jedoch trivial einfach, solche Daten zu ändern. Und wenn ich versuchen würde, einen Marktplatz für Geld zu täuschen, würde ich die Daten von links nach rechts und in der Mitte ändern.
Peter M

@PeterM Ich bin mir nicht ganz sicher, was du meinst. Sie möchten ein Bild zuschneiden? Diese Site erkennt weiterhin, dass sie hochskaliert wurde.
Jack

Fragen Sie sich, woher es weiß, dass das Bild zugeschnitten wurde. Wo werden Ihrer Meinung nach die Informationen gespeichert, aus denen hervorgeht, wie groß das Originalbild war?
Peter M

@PeterM Nun, ich bin mir nicht sicher, wie genau es funktioniert, aber ich habe es ein bisschen benutzt und ich kann Ihnen sagen, dass es die Pixel analysiert und basierend darauf die ursprüngliche Auflösung erkennt. Es wird nicht das Dateiformat analysiert, sondern die Pixel selbst. Die ursprüngliche Auflösung wird also nirgendwo gespeichert.
Jack

@Jack Wenn "es die Pixel analysiert", verwendet es wahrscheinlich so etwas wie DOG.
Damian Yerrick
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.