コマンドラインから「不良」画像を検出する

コマンドラインから「不良」画像を検出する

ディスクを誤ってフォーマットしてしまったところから、膨大な数の画像を復元しました。

これらの画像の多くは破損しています。つまり、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の使用

次の Octave スクリプトは、コマンド ラインから直接呼び出すことができます。引数は、2 つのディレクトリ名errdirと、baddir画像ファイルのリストです。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++ の観点からは不良または破損している可能性がありますが、通常はより寛容な画像ビジュアライザーでは問題なく読み取ることができます。

関連情報