我有大量文件,其中有黑色毡布背景上的硬币图片。使用 ImageMagick,我可以使用 -trim 和 -fuzz 相当直接地自动修剪这些图像。
边缘检测运行良好,我想找到一个参数,让我能够说“找到边缘然后后退 10 个像素”,即在硬币周围保留 10 个像素的周长,而不是直接裁剪它。我不希望像使用 -splice 命令那样添加新边框,而是保留与原始图像的间距。
到目前为止,我还没有找到办法来做到这一点,我想到最接近的办法是在 -trim info:- 模式下运行它,捕获输出并使用手动裁剪重新计算裁剪,但我真的更喜欢一步到位的过程。
我在 Windows 10 下使用 ImageMagick,虽然我已经安装了 bash 扩展,但我还没有在其下测试任何脚本,因此纯粹使用 Imagemagick 命令行的解决方案是首选。
答案1
由于缺乏一个优雅的解决方案,我选择了一个可行的解决方案,并编写了一个粗糙的 bash 脚本,该脚本似乎可以很好地完成工作。这会在硬币周围留下 25px 的偏移,使用原始图形来提供背景。我最终会参数化并清理它,但这是今天的工作脚本。
for f in *.jpg; do
trimbox=$(convert $f -fuzz 25% -format "%@" info:)
orig=$trimbox
first=${trimbox%x*}
trimbox=${trimbox#*x}
second=${trimbox%%+*}
trimbox=${trimbox#*+}
third=${trimbox%+*}
fourth=${trimbox#*+}
#echo "trimbox: $orig first: $first second: $second third: $third fourth:$fourth"
((first+=50))
((second+=50))
((third-=25))
((fourth-=25))
trimbox=$first"x"$second"+"$third"+"$fourth
convert "$f" -crop "$trimbox" +repage "trimmed-$f"
done
答案2
您可以使用-border
并-bordercolor
实现这一点 - 例如对于透明边框,您可能需要:
for f in *.jpg; do
convert -fuzz 25% -trim -border 25 -bordercolor none +repage $f trimmed-$f
done