Wie kann ich genau feststellen, was sich zwischen zwei Bildern geändert hat?

28

Zum Beispiel wollte ich für ein Gespräch über JPEG-Komprimierung Pixel für Pixel vergleichen, was sich zwischen zwei JPEGs geändert hat (eines mit Komprimierungsstufe 100 und eines mit Komprimierungsstufe 95).

Wie erstelle ich gute visuelle Karten von Änderungen ohne langwierige benutzerdefinierte Softwareprogrammierung?

Taxifahrer
quelle
2
Dies nicht als Antwort zu senden, da es wahrscheinlich keine praktikable Lösung für Fotos ist, aber GitHub (eine Programmierseite) bietet einige interessante Möglichkeiten zum Vergleichen von Bildern: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Klicken Sie auf "2-fach", "Wischen", "Zwiebelschale" und "Unterschied".
Henrik N

Antworten:

35

Photoshop + Ebenen FTW. (Ja, Sie können auch Gimp oder eine andere Bearbeitungssoftware mit denselben Funktionen verwenden.)

Beginnen Sie mit Ihrem Basis-Image. Im obigen Fall habe ich das Image mit JPEG-Qualität 100 verwendet.

  1. erstelle eine neue Ebene darüber
  2. Füge das zweite Bild in diese Ebene ein
  3. stell den Ebenenstil auf "Unterschied" (siehe linker rosa Pfeil im 1. Bild unten)
  4. erstelle eine Effektebene darüber (Ebene> Neue Anpassungsebene> Schwelle)
  5. Setze den Effekt auf einen Schwellenwert (siehe den rechten rosa Pfeil im ersten Bild unten)
  6. Setzen Sie den Schwellenwert auf 1

In dem resultierenden Bild ist jedes Pixel, das sich in irgendeiner Weise zwischen den beiden Bildern unterscheidet, weiß. Sie können es anpassen, um die Dinge "ein wenig anders" zu machen, indem Sie den Schwellenwert ändern.

Beispiel mit vielen Unterschieden zwischen JPEG 92 und 100 von Lightroom. Vergleich von JPEG 92 und 100 aus LR mit Photoshop-Ebenen

Beispiel zeigt keinen Unterschied zwischen 95 und 100. Vergleichen von JPEG 95 und 100 von LR mit Photoshop-Ebenen

Nicht, dass nur ein binäres "Geändert oder Nicht" angezeigt wird. Was wäre, wenn Sie detaillierter wissen möchten, wie stark es sich geändert hat, beispielsweise nach Farbkanal?

  1. Ersetzen Sie die Ebene für die Schwellenwertanpassung durch eine Ebene für die Kurvenanpassung.
  2. Bearbeiten Sie die Kurve
  3. Show Clipping einschalten
  4. Fassen Sie den weißen Eingabegriff unterhalb der rechten unteren Ecke und ziehen Sie ihn so weit wie möglich nach links
  5. Bewegen Sie sich langsam zurück nach rechts, bis Sie keinen Ausschnitt mehr sehen (das Vorschaubild ist komplett schwarz).
  6. Schalten Sie das Clipping wieder aus und speichern Sie die Kurvenänderung

Je heller die resultierenden Pixel sind, desto mehr unterscheiden sie sich in dieser Farbe. Der Nachteil ist jedoch, dass Sie am Ende viel grauen Schlamm haben. Manchmal ist es einfacher, den Schwellenwert festzulegen, um festzustellen, wo Unterschiede bestehen. Deshalb baue ich beides und schalte um, welches sichtbar ist.

beschreibendere Sicht auf den Unterschied

Taxifahrer
quelle
Neue Frage, aber wie machst du Schritt 4, "erstelle eine Effektebene darüber"? Kann es nirgendwo finden. Es ist auch 7 Jahre später und ich benutze die neueste Version für vielleicht haben sie den Namen auch geändert?
Whitneyland
14

Wenn Sie Photoshop verwenden, gehen Sie wie folgt vor:

Legen Sie die beiden JPEG-Dateien in derselben PSD-Datei in zwei separaten Ebenen ab. Sie sollten sich genau überlappen, da ihre Abmessungen gleich sind. (welches oben drauf geht ist egal).

Stellen Sie den Ebenenüberblendungsmodus auf "Unterschied". Sie würden ein größtenteils schwarzes Ergebnis sehen. Abhängig vom Qualitätsunterschied zwischen den beiden Originalebenen können Sie mehr oder weniger Rauschen sehen.

Bildbeschreibung hier eingeben

Jin
quelle
Der Unterschied allein hilft nicht viel, wenn man so eine große schwarze Leere hat. :)
cabbey
@ Cabbey sicher, wenn Sie 100% bis 95% vergleichen, erhalten Sie höchstwahrscheinlich ein durchgehendes Schwarz. Aber das ist, was deine Frage gestellt hat, nicht wahr? In der Antwort Ihres Besitzers ändern Sie die Werte der verglichenen Originale, sodass sie nicht mehr die ursprünglichen Komprimierungseinstellungen haben.
Jin
Sie erhalten praktisch bei jedem Vergleich ein solides Schwarz, da die Unterschiede so gering sind. Die Schwellwert- / Kurvenebene nach dem Unterschied wirkt sich nicht auf die Komprimierungseinstellungen aus, sondern hilft nur bei der Visualisierung der unteren Grenzen dieser schwarzen Suppe, die der Unterschied zubereitet hat. (Ich bin mir nicht hundertprozentig sicher, was Sie damit gemeint haben, also könnte ich dort in eine andere Richtung
aufbrechen
@cabbey wenn du nach einer rein bitweisen Operation der Differenz zwischen den beiden Bildern fragst, dann gibt dir der Mischmodus "Differenz" alleine das. Wenn Sie den Schwellenwert / die Kurve anpassen, ist das Ergebnis zwar mit bloßem Auge besser zu erkennen, es ist jedoch keine genaue Darstellung der Änderungen. Wenn Sie das tun, vergleichen Sie nicht länger 100% mit 95%.
Jin
Sicher bist du das. Die Komprimierungsstufe spielte keine Rolle mehr, wenn der zweite Photoshop das Bild von der Festplatte in die internen Puffer lädt. Es handelt sich nun um ein unkomprimiertes Pixelarray im Speicher der Kompressionsstufe ist nicht relevant.
Cabbey
13

Alle Bildverarbeitungspakete sollten dies einfach machen. Ich zeige Ihnen, wie es in Mathematica gemacht wird, wenn Sie Zugriff auf dieses System haben. Mathematica ist eine Programmiersprache, aber es ist wirklich einfach, diese Art von Manipulationen durchzuführen. Wenn Sie also Zugriff darauf haben (z. B. über eine Universitätslizenz), empfehle ich, dass Sie es ausprobieren!

Importieren Sie zunächst das Bild:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Komprimieren Sie es erneut mit JPEG-Komprimierung

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Mathematica-Grafiken

Nehmen Sie nun die Differenz der Pixelwerte und konvertieren Sie sie zuerst in Gleitkommazahlen, um sicherzustellen, dass negative Werte erhalten bleiben.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Mathematica-Grafiken

Auf dem Differenzbild ist nicht viel zu sehen (der Unterschied ist winzig), und negative Werte werden auf Schwarz abgeschnitten. Skalieren wir also alle Werte neu, um den gesamten Dynamikbereich auszufüllen (das Minimum wird auf 0 skaliert, das Maximum auf 1):

ImageAdjust[diff]

Mathematica-Grafiken

ImageDifferencegibt den absoluten Unterschied der beiden Bilder an und erzeugt keine negativen Zahlen. Dies ist der Vorgang, den Sie eher in Bildverarbeitungspaketen finden, insbesondere in GUI-Paketen (Photoshop, GIMP).

ImageDifference[img, img2]

Mathematica-Grafiken

Wir können auch einen einzelnen RGB-Kanal verwenden, zum Beispiel den roten, und die positiven und negativen Unterschiede mit 'entgegengesetzten' Farben visualisieren:

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Mathematica-Grafiken

Hier ist das Gleiche, mit den Unterschieden, die fünfmal verstärkt wurden. Die JPEG-Artefakte sind jetzt besser erkennbar.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Mathematica-Grafiken

Der Vorteil der Verwendung einer Programmiersprache besteht darin, dass wir dies leicht automatisieren können und sehen können, wie sich der Unterschied für "Komprimierungsstufen" zwischen 0,1 und 1,0 ändert:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Mathematica-Grafiken

Szabolcs
quelle
Es ist immer gut, eine geskriptete / automatisierte Option zu sehen! :)
jrista
5

Sie können die Befehlszeilentools von Imagemagick verwenden.

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

liefert den absoluten Wert der Differenzen für jeden RGB-Kanal.

mikael
quelle
0
  1. Öffnen Sie eines der Bilder in GIMP oder Photoshop.
  2. Fügen Sie das zweite Bild als neue Ebene über der ersten hinzu.
  3. Stelle den Mischmodus der obersten Ebene auf "Unterschied"

In dem resultierenden Bild zeigen die schwarzen Teile, wo die Originalbilder identisch sind, und alles, was heller ist, zeigt Unterschiede.

Dan
quelle
Der Unterschied allein hilft nicht viel, wenn man so eine große schwarze Leere hat. :)
cabbey
Sie können die Pegel für das resultierende Bild jederzeit anpassen. Wann immer ich diese Technik angewendet habe, hatte ich Bilder, die so unterschiedlich waren, dass ich die Änderungen sehen konnte :)
Dan,