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

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

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

이러한 이미지 중 상당수가 손상되었습니다. 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++의 관점에서 불량하거나 손상되었을 수 있지만 일반적으로 더 관대한 이미지 시각화 도구에서는 잘 읽을 수 있습니다.

관련 정보