从命令行检测“坏”图像

从命令行检测“坏”图像

我已经恢复了因意外格式化磁盘而导致的大量图像。

其中大量图像已损坏,即。 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

这可以作为编写 shell 脚本的基础,但它不擅长检查许多文件,因为 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++ 的角度来看,出错的文件可能是坏的或损坏的,但在通常更宽松的图像可视化器上具有良好的可读性。

相关内容