检测空白图像文件

检测空白图像文件

我使用的是scanimage支持双面扫描的文档扫描仪(佳能 DR-2510C)。遗憾的是,其 SANE 驱动程序不支持空白页检测,因此在混合页面(单面/双面)的情况下,空白页会进入扫描结果。

我想在对扫描输出进行后期处理时自动删除那些空白页,因此我正在寻找一个能够检测 TIFF 或 PNM 文件是否主要由白色像素组成的命令行工具。

有任何想法吗?


这是我根据 lesmana 的回答想出的解决方案:

for i in "${DEST_DIR}/out"*.pnm; do
  histogram=`convert "${i}" -threshold 50% -format %c histogram:info:-`
  white=`echo "${histogram}" | grep "white" | sed -n 's/^ *\(.*\):.*$/\1/p'`
  black=`echo "${histogram}" | grep "black" | sed -n 's/^ *\(.*\):.*$/\1/p'`
  blank=`echo "scale=4; ${black}/${white} < 0.005" | bc`
  if [ ${blank} -eq "1" ]; then
    echo "${i} seems to be blank - removing it..."
    rm "${i}"
  fi
done

答案1

您可以使用图像魔术师比较工具将扫描的图像与“主”空白页进行比较。由于我的 ImageMagick-fu 非常有限,我无法为您提供任何示例命令。您必须阅读手册

第二个链接甚至有一个名为“空白传真”的部分,解释了如何检测空白传真页。遗憾的是,该部分似乎尚未完成。希望现有信息足以让您开始。

答案2

使用确认ImageMagik CLI 的功能如下所示:

http://www.imagemagick.org/script/identify.php

使用命令:

$ identify -format "%#" source.png

如果颜色数量为 1,则页面为空白。

您也可以使用以下命令:

identify -verbose source.png

对于空白图像,标准差、偏度和峰度将为 0。

答案3

问题中代码的稍微改进的版本:

#!/bin/bash

mkdir -p "blanks"

for i in "$@"; do
    echo "${i}"
    if [[ -e $(dirname "$i")/.$(basename "$i") ]]; then
        echo "   protected."
        continue
    fi

    histogram=$(convert "${i}" -threshold 50% -format %c histogram:info:-)
    #echo $histogram
    white=$(echo "${histogram}" | grep "white" | cut -d: -f1)
    black=$(echo "${histogram}" | grep "black" | cut -d: -f1)
    if [[ -z "$black" ]]; then
        black=0
    fi

    blank=$(echo "scale=4; ${black}/${white} < 0.005" | bc)
    #echo $white $black $blank
    if [ "${blank}" -eq "1" ]; then
        echo "${i} seems to be blank - removing it..."
        mv "${i}" "blanks/${i}"
    fi
done

变化:

  • 将图像作为参数进行检查,而不是从固定位置读取
  • 进度报告
  • 如果代码无法正确检测到文件,您可以给它一个提示(创建一个空文件,其名称为图像名称加上前面的点,即保护a.pnm,使用touch .a.pnm
  • 修复输入中没有黑色像素时的错误

答案4

我的诀窍是将图像扫描为无损压缩格式(tiff + 压缩)。这样,空白页的文件大小就会小很多,我可以用 检测它们find,将它们移动到另一个目录,用查看器快速检查它们,然后删除它们。

相关内容