Erkennen „schlechter“ Bilder über die Befehlszeile

Erkennen „schlechter“ Bilder über die Befehlszeile

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.

Beispiel für ein schlechtes Bild

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 errdirund baddireine 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 badimageund 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.

verwandte Informationen