Ein Bild mit ImageMagick „diffundieren“

177

Wie kann ich den Unterschied zwischen zwei Bildern feststellen? Ich habe das Originalbild. Jemand hat auf ein genaues Duplikat des Originalbildes geschrieben. Jetzt muss ich das Original mit dem auf dem Bild geschriebenen vergleichen und nur die Schrift im Bildformat extrahieren.

Beispiel: Ich habe ein Bild von einem Haus. Jemand nahm eine Kopie und schrieb "Hallo!" auf der Kopie. Ich möchte die beiden Bilder irgendwie vergleichen, das Haus entfernen und ein Bild mit den Worten „Hallo!“ Hinterlassen.

Ist das mit ImageMagick möglich? Ich weiß, dass es Möglichkeiten gibt, den statistischen Unterschied zwischen Bildern zu ermitteln, aber das ist nicht das, wonach ich suche.

Justin Noel
quelle
8
Probieren Sie diesen Abschnitt der ImageMagick-Bedienungsanleitung aus!
Benoit
1
Ich weiß, dass es sich bei dieser Frage um ImageMagick handelt, aber ich musste nur einen Link zu Resemble.js für den "kausalen" Sucher einfügen, der möglicherweise nach einer agnostischen Lösung sucht.
Brichins
Kennt jemand ein Werkzeug, das 2 Bilder vergleicht, indem die Pixel des zweiten Bildes vom ersten subtrahiert werden? Ich würde es vorziehen, nicht meine eigenen zu schreiben.
MarcusJ
Imagemagick 7 hat Wahrnehmungs-Hash, eine Technik, die unveränderliche Bildmomente verwendet. Es ist schön in dem Sinne, dass es auch nach Drehung,
Laufverzerrung
1
@ v.oddou, danke. Ich habe Dokumente gelesen und noch einige Tests durchgeführt. Bei Strichzeichnungen mit sehr geringer Bevölkerungsdichte und extrem geringer Pixeldichte scheint die Leistung schlecht zu sein. Es sieht so aus, als ob die Pixeldichte der Schlüssel in PHASH ist, um Ähnlichkeit zu identifizieren.
BReddy

Antworten:

320

Meine eigenen Favoriten sind diese beiden:

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf

Der einzige Unterschied zwischen den beiden obigen Befehlen: Der erste zeigt den visuellen Unterschied zwischen den beiden Bildern als PNG-Datei, der zweite als PDF.

Die resultierende Diff-Datei zeigt alle Pixel an, die sich in der roten Farbe unterscheiden. Diejenigen, die unverändert sind, erscheinen weiß.

Kurz und bündig.

Beachten Sie, dass Ihre Bilder nicht vom gleichen Typ sein müssen. Sie können sogar JPEG, TIFF, PNG mischen - unter einer Bedingung: Die Bilder sollten dieselbe Größe haben (Bildgröße in Pixel). Das Ausgabeformat wird durch die Erweiterung des Ausgabedateinamens bestimmt.

Sollten Sie aus irgendeinem Grund eine höhere Auflösung als die Standardauflösung (72 dpi) benötigen, fügen Sie einfach einen geeigneten -densityParameter hinzu:

 compare -density 300 image1 image2 -compose src diff.jpeg

Illustrierte Beispiele

Hier sind einige Abbildungen der Ergebnisse für Variationen des obigen Befehls. Hinweis: Die beiden verglichenen Dateien waren sogar PDF-Dateien , daher funktioniert es auch mit diesen (solange es sich um 1-Pager handelt)!


Links: Bild mit Text       Mitte: Originalbild       Rechts: Unterschiede (= Text) in roten Pixeln. Nur rote Differenzpixel;  identische Pixel sind weiß

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

Dies ist der gleiche Befehl, den ich oben vorgeschlagen habe.


Links: Bild mit Text       Mitte: Originalbild       Rechts: Unterschiede in 'seegrünen' Pixeln. Nur Seagreen-Differenzpixel;  identische Pixel sind weiß

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

Dieser Befehl fügt einen Parameter hinzu, um die Differenzpixel "seegrün" anstelle des Standardrot zu machen.


Links: Bild mit Text       Mitte: Originalbild       Rechts: Blau unterscheidet sich (aber mit etwas Kontexthintergrund) Nur blaue Differenzpixel;  erstes der verglichenen Bilder als aufgehellter Hintergrundl

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

Dieser Befehl entfernt den -compose srcTeil - das Ergebnis ist das Standardverhalten, bei comparedem das erste der beiden unterschiedlichen Bilder als aufgehellter Hintergrund beibehalten wird. (Diesmal mit zusätzlichen Parametern, damit die Diff-Pixel blau angezeigt werden.)

Kurt Pfeifle
quelle
Ich kann nicht verstehen, woher diese Vergleichs-Cli kam? Ist es Teil von Imagebrick? unter Windows verfügbar?
Krishnom
2
@Krishnom: Es gibt keinen "Imagebrick". Meinst du ImageMagick?
Kurt Pfeifle
2
@Krishnom: Die Frage wurde explizit nach einer ImageMagick-Lösung gestellt. Ein Teil der v6.x-Software-Suite von ImageMagick hatte ein separates CLI-Tool namens 'compare'. Für v7.x von ImageMagick sollten Sie 'magick compare'stattdessen ausführen .
Kurt Pfeifle
Mein Fehler. Vielen Dank für die Korrektur (imagebrick -> imageMagick). Ich werde es versuchen. Ich suche auch ein Werkzeug, um Massenbilder zu vergleichen.
Nochmals vielen
@Krishnom: Ich weiß nicht, was ein "Massenbild" ist. Aber ich wette immer noch, dass die ImageMagick-Tool-Suite das tun kann, was Sie wollen.
Kurt Pfeifle
53

Obwohl comparees für viele Anwendungen gute Arbeit leistet, habe ich festgestellt, dass ich manchmal einen anderen Ansatz bevorzuge, insbesondere beim Vergleich von Bildern, die größtenteils Graustufen sind:

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

Die Idee ist wie folgt: Konvertieren Sie beide file1.pngund file2.pngin Graustufen. Dann trat der erste als roter Kanal des resultierenden Bildes, der zweite als grüner Kanal. Der blaue Kanal wird aus diesen beiden unter Verwendung des darkenCompose-Operators gebildet, was im Wesentlichen bedeutet, das Minimum zu nehmen.

Dinge, die in beiden Bildern weiß sind, bleiben also weiß. Dinge, die in beiden Bildern schwarz sind, bleiben schwarz. Dinge, die im ersten Bild weiß, in der zweiten schwarz sind, werden rot, und Dinge, die in der zweiten weiß sind, in der ersten schwarz, werden grün.

Das Ergebnis liefert ein schön farbcodiertes Bild, in dem Sie der ersten Eingabe leicht Grün und der zweiten Rot zuordnen können. Hier ist ein Beispiel, in dem ich die Ausgabe von LaTeX mit der von KaTeX vergleiche (bevor ich einen Fehler behoben habe , um dies zu verbessern ):

Geben Sie hier die Bildbeschreibung ein

Sie können die Ansätze kombinieren, indem Sie comparesehen, wo sich etwas geändert hat, und dann die oben genannten verwenden, um detaillierter zu sehen, wie sich etwas geändert hat.

MvG
quelle
2
Nett! Ich brauchte eine Interaktion, also habe ich Ihre Methode in Gimp repliziert. Als Referenz: 1) Bilder als Ebenen laden, 2) Farbe -> Beide Ebenen entsättigen, 3) Alphakanäle aus beiden Ebenen auf der Registerkarte Ebenen entfernen, 4) die G + B-Kanäle auf einer Ebene auswählen, alle auswählen und die Kanäle löschen mit schwarzer Farbe, das gleiche gilt für die R + B-Kanäle auf der zweiten Ebene. 4) Stellen Sie den Bildschirmmodus für die obere Ebene auf der Registerkarte Ebenen ein.
Matěj Šmíd
1
@Palmstrom: Danke! Ich habe diese Bildvergleiche ursprünglich mit Gimp selbst durchgeführt, aber ich habe den Ebenenmodus „Körnerextrakt“ direkt auf den Eingabebildern verwendet, sodass gemeinsame Bereiche grau werden, während das Diff in der einen Richtung schwarz und in der anderen weiß ist . Schwieriger zu lesen, aber schneller zu generieren, und es kann Farbinformationen enthalten. Ich denke, Sie würden meinem Befehl noch besser entsprechen, wenn Sie "nur abdunkeln" anstelle von "Bildschirm" verwenden und nicht verwendete Kanäle weiß statt schwarz färben würden.
MvG
1
Einige PDF-Eingaben führen aus irgendeinem Grund nach der Graustufenkonvertierung zu einem invertierten Bild. Verwenden -colorspace grayanstelle von -grayscale Rec709Luminancebehebt das, aber dies bringt die Komposition durcheinander. Fügen Sie -respect-parenthesesals erste Option hinzu convert, um dies zu erledigen.
Brecht Machiels
Hier ist ein Skript, mit dem zwei PDF- Dateien mit dieser Methode Seite für Seite visuell unterschieden werden können: gist.github.com/brechtm/891de9f72516c1b2cbc1 . Es gibt ein JPG für jede Seite der PDFs in einem pdfdiffVerzeichnis aus und druckt zusätzlich die Nummern der Seiten, die sich zwischen den beiden PDFs unterscheiden.
Brecht Machiels
1
In ImageMagick v6.7.7-10 scheint -grayscalees nicht unterstützt zu werden, ich musste verwenden, -colorspace graywie @BrechtMachiels vorgeschlagen
Austinmarton