명령줄에서 "잘못된" 이미지 감지

명령줄에서 "잘못된" 이미지 감지

실수로 디스크를 포맷하여 수많은 이미지를 복구했습니다.

이러한 이미지 중 상당수가 손상되었습니다. 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 스크립트는 명령줄에서 직접 호출할 수 있습니다. 해당 매개변수는 두 개의 디렉터리 이름 errdirbaddir이미지 파일 목록 이어야 합니다 . Octave에서 사용하는 LibMagick++ 라이브러리에서 경고 또는 오류를 제공하는 파일은 로 이동됩니다 errdir. 동일한 색상의 줄의 마지막 25%는 baddir다른 파일로 이동됩니다. 표준 출력은 간결한 보고서를 제공합니다.

파일을 이동하지 않고 보고만 해야 하는 경우 디렉터리 이름을 처음 두 인수로 전달하지 마세요.

#!/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. 파일 목록과 해당 상태(양호, 불량, 오류)가 표시됩니다.

출력을 검토하고 스크립트 내에서 임계값을 변경하여 보다 공격적(낮은 임계값) 또는 보수적(높은 임계값) 동작을 달성할 수 있습니다. 이미지 파일 이름만 인수로 제공하면 파일을 이동하거나 변경하지 않으므로 원하는 경우 이를 테스트할 수 있습니다.

결과가 만족스러우면 두 개의 디렉터리를 만듭니다 mkdir errpics badpics. 그런 다음 스크립트를 호출하면 ./badimage errpics badpics *.jpg스크립트가 위에서 설명한 대로 파일을 디렉터리로 이동합니다.

참고: 이 스크립트를 사용한 후 삭제하기 전에 불량 또는 잘못된 것으로 표시된 이미지의 좋은 샘플을 확인하십시오!

잘못된 이미지를 감지하는 알고리즘은 사진에는 신뢰할 수 있지만 동일한 색상의 광범위한 법적 영역이 포함될 수 있는 그림, 로고, 차트, 그래프에는 반드시 그런 것은 아닙니다. 잘못된 파일은 LibMagick++의 관점에서 잘못되었거나 손상되었을 수 있지만 일반적으로 더 관대한 이미지 시각화 도우미에서는 읽을 수 있습니다.

관련 정보