Kommandozeilentool um zu prüfen, ob zwei Bilder grafisch exakt gleich sind

Ich brauche ein Befehlszeilentool, das 2 Bilder vergleicht und sagt, ob ihre Inhalte unabhängig von der Codierung gleich sind - dh eines könnte ein * .bmp und das andere ein * .png sein, solange alle ihre Breite, Höhe und alle entsprechenden Pixel sind gleich.

  • Exakte grafische Gleichheit ist erforderlich
  • Kompressionsverluste, selbst wenn sie fast unsichtbar sind, ergeben ein anderes Bild
  • Gleiche Alpha-Transparenz ist ebenfalls wichtig
  • EXIF/etc irrelevant
Nur zur Verdeutlichung, die Metadaten (zB EXIF ​​) sind nicht relevant, oder?
@CristianCiupitu Ja, nur dass die Bilder auf jedem Hintergrund gleich angezeigt werden (dh Alpha-Transparenz ist ein Unterschied).

Antworten (7)

Mit ImageMagick ( apt-get install imagemagick) können Sie Bilder unabhängig von Kodierung und Metadaten wie folgt vergleichen:

identify -quiet -format "%#" images...

Beachten Sie, dass Bilder, die mit verlustbehafteter Komprimierung wie JPEG (*.jpg) codiert wurden, subtile, oft unsichtbare Änderungen aufweisen.

Siehe auch ImageMagick-Beispiele: Bildsignaturen .

Genau genommen müssen Sie auch das Farbmodell und die Skalierung der Pixelwerte vergleichen. Sie sind möglicherweise nicht Teil der Metadaten im Bild.

Gute Antwort. Nur zur Verdeutlichung: Dies druckt verkettete Prüfsummen für jedes Bild in images. Dann müssen Sie überprüfen, ob diese Prüfsummen gleich sind.
Funktioniert nicht, wenn zwei visuell identische PNGs verglichen werden, wobei eines eine Palette ( 8-bit colormap) und das andere ein vollständiges RGBA ( 8-bit/color RGBA) ist. Sie zeigen keinen Unterschied mit ImageMagick: compare -dissimilarity-threshold 1 palette.png rgba.png difference.pngaber diese Prüfsummen sind unterschiedlich.
@int_ua Danke! Möchten Sie eine Bearbeitung vornehmen, um sie als Notiz am Ende hinzuzufügen? (Oder sollte ich)
Bitte tun Sie es, fügen Sie vielleicht einen Link zu einer anderen Antwort hinzu, die in meinem Fall funktioniert hat: softwarerecs.stackexchange.com/a/42004/71752

Wenn Sie MATLAB haben, können Sie Folgendes verwenden:

% Reading images as array to variable 'a' & 'b'. 
a = imread('MIMICDatacollection.bmp'); 
b = imread('MIMICDatacollection.png'); 

% Flatten multidimensional arrays to 1D
c=a(:);
d=b(:);

% Perform comparison
if length(c) ~= length(d)
    disp('The images do not have the same size') 
else
    e = corr2(c,d);           
    if e==1 
        disp('The images are same')
    else 
        disp('The images are not same') 
    end; 
end

Persönlich verwende ich es mit PNG und BMP, aber es sollte für jedes Format funktionieren, das von imread.

Wenn Sie es auf einem Computer ohne Matlab ausführen müssen, können Sie es in eine Funktion umwandeln und kompilieren, um es CLI zu machen.

Wenn Sie Matlab nicht haben, sollte es einfach sein, es in jede Hochsprache mit einer anständigen Bildbibliothek wie Python Imaging Library (PIL) zu portieren.

Verwandte Themen: Wie kann ich feststellen, ob ich doppelte Bilder herunterlade/speichere?

Wäre sowas > 0.95nicht besser als == 1Kompressionsartefakte bei verlustbehafteter Kompression zu kompensieren?
@vsz Ich habe es nicht ausprobiert, aber das klingt vernünftig.
@vsz Eigentlich will Asker grafisch genau dasselbe, also == 1ist es richtig.

Der Exit-Status von ImageMagick compare -metric AEist ungleich Null, wenn sich mindestens eine Pixelfarbe unterscheidet.

Angenommen, Sie haben einen Ordner mit dem Namen before, der Originalbilder enthält, und einen Ordner after, der visuell identische Bilder mit demselben Dateinamen enthalten sollte. Mit ImageMagickcompare können Sie Folgendes tun:

for file in before/*.png; do
    result=$(compare -metric AE "${file}" "${file/before/after}" /tmp/diff.png 2>&1);
    if [ "${result}" != '0' ]; then
        echo "${result} incorrect pixels in ${file}";
    fi;
done;
Funktioniert dies, soweit Sie wissen, bei Bioformat-Bildern wie .TIF oder .NDPI?
Ich habe meine Antwort hier gefunden: imagemagick.org/script/formats.php . Der erste Schritt - der für meine Zwecke am Ende auch schnell genug ist - ist also, in kleine PNG-Dateien zu konvertieren und diese zu vergleichen.

findimagedupes - Findet visuell ähnliche oder doppelte Bilder

findimagedupes ist ein Befehlszeilendienstprogramm, das einen groben "visuellen Unterschied" zwischen zwei Bildern durchführt. Auf diese Weise können Sie zwei Bilder oder einen ganzen Baum von Bildern vergleichen und feststellen, ob sie ähnlich oder identisch sind. Bei gängigen Bildtypen scheint findimagedupes etwa 98 % genau zu sein.

Leider funktioniert es in meinem Fall nicht, da visuell ähnliche (aber nicht gleiche) Bilder als Duplikate gemeldet werden. Ich brauche es, um die Ergebnisse automatisierter Tests zu überprüfen, also ist exakte Gleichheit erforderlich, nicht nur Ähnlichkeit.

Ich habe schließlich ein kleines Qt-Programm namens imgdiff erstellt, das zwei Dateinamen akzeptiert und einen Pixel-für-Pixel-Vergleich durchführt. Es wird eine Fehlermeldung ausgeben, wenn sie sich unterscheiden, und mit 1 beendet werden, oder stillschweigend mit 0 beendet werden, wenn sie gleich sind.

Beispielverwendung wäre:

imgdiff img1.png img2.bmp

Link zum Google Code-Projekt - https://code.google.com/p/imgdiff/ .

Probieren Sie Dupeguru hier aus: https://dupeguru.voltaicideas.net/ . Im Bildmodus sucht es nach ähnlichen Bildern, obwohl sie unterschiedliche Größen haben, es hat eine Schwellenwerteinstellung, erstellt Gruppen ähnlicher Dateien, wählt die größte Datei als Hauptdatei, kann aber auch eine andere Datei als Referenz festlegen. Kann Dateien in einen Pfad oder in den Papierkorb verschieben oder sie vollständig löschen. Es ist plattformübergreifend.

Ein weiteres interessantes Tool, das auch für verschiedene Merge-Operationen verwendet werden kann, ist WinMerge: https://winmerge.org/ . Dies hat eine interessante Funktion, die die unterschiedlichen Bereiche in den Bildern hervorhebt, aber gleichzeitig bis zu drei Dateien oder drei Pfade, die Dateien enthalten, vergleichen kann, aber nur die Dateien mit demselben Namen vergleicht, wenn sie auf diesen Pfaden gefunden werden. Dies ist gut für die Ordnersynchronisierung. Dies ist nur Windows, läuft gut in Wine, aber es ist eine QT-Version verfügbar, die sich in einem frühen Stadium zu befinden scheint: https://github.com/OzzieIsaacs/winmerge-qt .

Können Sie Details zu den relevanten Funktionen einer solchen Software hinzufügen?

Möglicherweise müssen Anpassungen vorgenommen werden, um den Alphakanal angemessen zu handhaben, aber die Konvertierung in ppm und die Prüfsummenbildung scheinen zu funktionieren:

#!/bin/bash

find "${@:-.}" -type f -print |\
while IFS= read -r file; do
    hash=$(convert 2>&- "${file}" -strip ppm:- | md5sum) 
    # we get this hash if convert fails and produces no output
    [ "$hash" = 'd41d8cd98f00b204e9800998ecf8427e  -' ] \
    || echo "$hash ${file}"
done |\
sort | uniq -w32 --all-repeated=separate | sed 's/^.\{36\}//'