在python中集中裁剪图像的最佳方法是什么?

elk*_*000 5 python image tensorflow

我有20,000张矩形图像,我想对它们进行中心裁剪,以便将它们插入机器学习算法中。

Tensorflow有tf.image.central_crop(),但是我想在TF介入之前检查图片。该函数采用张量并输出张量。

在Python中裁剪它们的最佳工具是什么?

编辑:或者,什么是计算中心作物的最佳算法?

Mar*_*ell 6

您可以使用ImageMagick轻松快速地完成此操作,无需编写任何代码,ImageMagick安装在大多数 Linux 发行版上,可用于 macOS 和 Windows。

在终端中,通过设置gravitytocenter并指定与该位置的零偏移量,将图像裁剪为中央 50x50 像素,如下所示:

magick input.png -gravity center -crop 50x50+0+0 result.png
Run Code Online (Sandbox Code Playgroud)

如果你想裁剪到最大的正方形,你需要使用一个函数来找到高度和宽度中的较小者,并将其用于 50s 中的每一个:

magick input.png -gravity center -crop "%[fx:h<w?h:w]x%[fx:h<w?h:w]+0+0" result.png
Run Code Online (Sandbox Code Playgroud)

开始图片:

在此处输入图片说明

结果:

在此处输入图片说明

好的,现在我们想要做 20,000 张图像,所以我们使用GNU Parallel,那就是:

parallel magick {} -gravity center -crop ... {} ::: *.png
Run Code Online (Sandbox Code Playgroud)

但是现在我们遇到了一些新问题。列表中的文件将是太长ARG_MAX,所以我们需要在饲料中的文件名stdinfind这样用空终止:

find . -name \*.png -print0 | parallel -0 magick {} -gravity center -crop ... {}
Run Code Online (Sandbox Code Playgroud)

-crop表达式中的特殊字符也有一个新问题,因此我们需要请GNU Parallel为我们计算引用。所以最后的命令变成:

find . -name \*.png -print0 | parallel -0 --quote magick {} -gravity center -crop "%[fx:h<w?h:w]x%[fx:h<w?h:w]+0+0" {} 
Run Code Online (Sandbox Code Playgroud)

这是一个非常强大的命令,可以快速更改数千张图像,覆盖原始图像,因此请先将它们复制到安全的地方,在一小部分图像上进行测试!

您可以通过以下方式获得进度条:

parallel --bar ...
Run Code Online (Sandbox Code Playgroud)

您可以进行“试运行”,要求GNU Parallel向您展示它做什么,而无需实际执行以下操作:

parallel --dry-run ...
Run Code Online (Sandbox Code Playgroud)

有一些方法可以使这更快,更容易阅读 - 当我有更多时间时,我可能会添加它们。