我使用的是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
答案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
,将它们移动到另一个目录,用查看器快速检查它们,然后删除它们。