Ich habe eine große Anzahl von Bildern nach einer versehentlichen Formatierung einer Festplatte wiederhergestellt.
Viele dieser Bilder sind beschädigt, z. B. 100 % grün oder 70 % grau. Leider haben sie alle noch EXIF-Daten, sodass ich diese nicht ohne weiteres verwenden kann, um herauszufinden, welche Bilder fehlerhaft sind.
Antwort1
Verwenden von Imagemagick
Hiermit erhalten Sie die Gesamtzahl der Pixel im Bild:
identify -verbose ~/www/pictures/ISTI-F.jpg | sed -n '/.*Pixels: /s///p'
und dieses hier gibt Ihnen den Namen der dominanten Farbe und die Anzahl der Pixel:
convert ~/www/pictures/ISTI-F.jpg -format "%c" histogram:info: | sort -nr -t: | head -1 | sed 's/\(.*\):.*#\(......\).*/\2\1/'
Beispiel:
$ identify -verbose ISTI-F.jpg | sed -n '/.*Pixels: /s///p'
1920000
$ convert ISTI-F.jpg -format "%c" histogram:info: | sort -nr -t: | head -1 | sed 's/\(.*\):.*#\(......\).*/\2\1/'
FFFFFF 1667711
Dies kann die Grundlage für das Schreiben eines Shell-Skripts sein, eignet sich jedoch nicht zum Überprüfen vieler Dateien, da Imagemagick zwar unglaublich flexibel, aber langsam ist
Verwenden von Octave
Das folgende Octave-Skript kann direkt von der Befehlszeile aus aufgerufen werden. Seine Argumente sollten zwei Verzeichnisnamen errdir
und baddir
eine Liste von Bilddateien sein. Dateien, für die die von Octave verwendete LibMagick++-Bibliothek eine Warnung oder einen Fehler ausgibt, werden nach verschoben errdir
; Dateien, bei denen die letzten 25 % der Zeilen dieselbe Farbe haben, werden nach verschoben baddir
; andere Dateien bleiben unverändert. Auf der Standardausgabe wird ein knapper Bericht ausgegeben.
Wenn Sie nur den Bericht möchten, ohne Dateien zu verschieben, geben Sie als erste beiden Argumente keine Verzeichnisnamen an.
#!/usr/bin/octave -qf
threshold = 0.25;
usage = "Usage is: badfiles <file...> OR badfiles <errdir> <baddir> <file...>\n";
files\n";
assert(nargin>0, usage);
dryrun = isfile(argv{1});
if !dryrun
errdir = argv{1};
baddir = argv{2};
assert(isfolder(errdir) && isfolder(baddir) && isfile(argv{3}), usage);
endif
start = 1 + 2*(!dryrun);
for fname = argv()(start:end)'
q = [];
f = fname{};
warning error
try
q = imread(fname{});
catch err
end_try_catch
warning on
if isempty(q)
printf("error\t");
dryrun || movefile(f, errdir);
else
qt = all(q == q(end,1,:) ,2);
qtt = squeeze(all(qt, 3));
r = 1 - find(qtt==0, 1, 'last') / size(q, 1);
if (r > threshold)
printf("bad--%02d\t", ceil(100*r));
dryrun || movefile(f, baddir);
else
printf("good-%02d\t", ceil(100*r));
endif
endif
disp(f);
endfor
Damit dies funktioniert, muss Octave installiert sein. Kopieren Sie das Obige in eine Datei namens badimage
, machen Sie sie mit ausführbar chmod +x badimage
und testen Sie das Skript wie folgt ./badimage *.jpg
: Sie sehen eine Liste der Dateien mit ihrem Status (gut, schlecht, Fehler).
Sehen Sie sich die Ausgabe an und ändern Sie ggf. den Schwellenwert im Skript, um ein aggressiveres (niedrigerer Schwellenwert) oder konservativeres (höherer Schwellenwert) Verhalten zu erzielen. Sie können es so lange testen, wie Sie möchten, da es keine Dateien verschiebt oder ändert, wenn Sie nur Bilddateinamen als Argumente angeben.
Wenn Sie mit den Ergebnissen zufrieden sind, erstellen Sie zwei Verzeichnisse mkdir errpics badpics
. Rufen Sie dann das Skript als auf ./badimage errpics badpics *.jpg
. Auf diese Weise verschiebt das Skript Ihre Dateien in die Verzeichnisse, wie oben beschrieben.
ACHTUNG: Überprüfen Sie nach der Verwendung dieses Skripts unbedingt eine gute Auswahl von Bildern, die als schlecht oder fehlerhaft markiert sind, bevor Sie sie löschen!
Der Algorithmus, der fehlerhafte Bilder erkennt, ist bei Fotos zuverlässig, aber nicht unbedingt bei Zeichnungen, Logos, Diagrammen und Graphen, die große zulässige Bereiche derselben Farbe enthalten können. Die fehlerhaften Dateien können aus Sicht von LibMagick++ fehlerhaft oder beschädigt sein, sind aber auf den normalerweise nachsichtigeren Bildvisualisierern gut lesbar.