コマンドラインで「誤った」画像を検出する

コマンドラインで「誤った」画像を検出する

誤ってディスクをフォーマットして多数の画像を回復しました。

これらの画像の多くは破損しています。 100%緑または70%グレー。残念ながら、まだEXIFデータが残っているため、すぐに使用してどの画像が不良かを判断することはできません。

悪い画像の例

ベストアンサー1

Imagemagickを使う

これにより、画像の総画素数が提供される。

identify -verbose  ~/www/pictures/ISTI-F.jpg | sed -n '/.*Pixels: /s///p'

これはデフォルトの色名とピクセル数を提供します。

convert ~/www/pictures/ISTI-F.jpg -format "%c" histogram:info: | sort -nr -t: | head -1 | sed 's/\(.*\):.*#\(......\).*/\2\1/'

例:

$ 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

これはシェルスクリプトの作成の基礎として使用できますが、Imagemagickは非常に柔軟ですが遅いため、多くのファイルをスキャンするのは良い方法ではありません。

オクターブの使用

次のOctaveスクリプトは、コマンドラインから直接呼び出すことができます。対応するパラメータは、2つのディレクトリ名errdirbaddirイメージファイルのリストでなければなりません。 Octaveで使用されているLibMagick ++ライブラリでは、警告またはエラーを提供するファイルがに移動されますerrdir。同じ色の行の最後の25%がbaddir別のファイルに移動されます。標準出力は簡潔なレポートを提供します。

ファイルを移動せずに表示する必要がある場合は、ディレクトリ名を最初の2つの引数として渡さないでください。

#!/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

この機能が機能するには、Octaveがインストールされている必要があります。上記の内容をというファイルにコピーしてbadimage実行可能にし、次のようにchmod +x badimageスクリプトをテストします./badimage *.jpg。ファイルのリストとそのステータス(良好、不良、エラー)が表示されます。

出力を確認し、スクリプト内のしきい値を変更して、より積極的な(低いしきい値)または保守的な(高いしきい値)動作を達成できます。イメージファイル名だけを引数として指定すると、ファイルを移動または変更しないため、必要に応じてテストできます。

結果が満足な場合は、2つのディレクトリを作成してくださいmkdir errpics badpics。その後、スクリプトを呼び出すと、スクリプトは上記の./badimage errpics badpics *.jpgようにファイルをディレクトリに移動します。

注:このスクリプトを使用した後、削除する前に、不良または誤ったとマークされた画像の良いサンプルを確認してください!

間違った画像を検出するアルゴリズムは、写真には信頼できますが、同じ色の広範囲の法的領域を含む可能性がある画像、ロゴ、チャート、グラフには必ずしもそうではありません。間違ったファイルはLibMagick ++の観点から間違っているか破損している可能性がありますが、通常はより寛大な画像可視化ヘルパーでは読み取ることができます。

おすすめ記事