在我的工作单位,护照大小的照片会被一起扫描,然后剪切成单独的照片,并以唯一的文件编号保存。目前我们使用 Paint.net 手动选择、剪切和保存图片。
我见过索尼的 Cybershot 相机有面部检测功能。当我在 Google 上搜索面部检测功能时,它还会显示有关 iphoto 的信息。Picasa 也有面部检测功能。有没有什么方法可以自动检测文档中的面部,从而减少剪切单个图像所需的时间,提高我工作中的效率。
样本扫描文档(真实文档有 5 行,每行 4 张图片 = 20 张图片):(来自:http://www.memorykeeperphoto.com/images/passport_photo.jpg, 合理使用)
例如,在 Picasa 3.8 中,单击“查看”>“人物”时,会显示所有面孔,并要求我为它们命名,我能否自动将这些单独的图片保存为不同的图片并使用名称?
答案1
自动裁剪护照照片听起来绝对可行。固定的照明条件、始终面朝前方、一致的图像格式……我认为没有人能要求比这更有利的人脸检测条件了。
我尝试使用人脸检测查看示例图像上的结果:
护照的格式和尺寸各不相同,因此它们会不规则地装在扫描仪的平板上,但我假设你会把照片一直直立放置。facedetect
将为我们提供所有脸部的中心和大小。特别是,我们可以使用脸部的大小并按比例裁剪其周围的区域。由于护照照片往往覆盖照片的固定区域,因此这似乎是一个相对安全的假设。
裁剪图像的子区域非常简单,使用图像魔术师我写了一个小的(粗糙的)shell 脚本来自动化这个过程:
#!/bin/sh
pc=60
files="P1Xb8.jpg"
fileno=1
for file in $files; do
n=1
facedetect $file | while read x y w h; do
border=$(($w * $pc / 100))
x=$(($x - $border))
y=$(($y - $border))
w=$(($w + $border * 2))
h=$(($h + $border * 2))
echo $x $y $w $h
convert "$file" -gravity NorthWest -crop "${w}x${h}+$x+$y" "${fileno}_$n.jpg"
n=$(($n + 1))
done
fileno=$(($fileno + 1))
done
我根据经验定义了一个边框区域,该区域为检测到的脸部宽度的 60%(在脚本的第二行)。这是我得到的四张图像:
这已经相当不错了。顶部总是会留有一些空白,我只需在调用中添加“-fuzz 10% -trim”即可将其删除convert
。这是之后第一张图片的结果:
对于一个简短的脚本来说,这个效果还不错,而且还有很大的改进空间。例如,大多数护照都使用纵向,因此具有不同的垂直/水平系数(通常为 1.3)。此外,面部往往会稍微向上移动(可能为 1.3)。纠正这些问题将产生更好的裁剪效果,从而避免完全修剪顶部的空白。
如果您可以发布(即使是私下)样本平板扫描来根据一些实际输出测试该脚本,那就太好了。
当然,这个建议需要 Linux 安装。但如果我理解正确的话,设置专用安装甚至虚拟机来自动执行这项繁琐的任务并非完全不合理。
如果隐私不是问题(但我表示怀疑),我实际上有兴趣帮助编写一个不错的解决方案以换取裁剪的人脸,我会用它来改进人脸检测模型。