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

标签 python image tensorflow

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

Tensorflow 有 tf.image.central_crop() 但我想在 TF 介入之前检查图片。该函数接受一个张量并输出一个张量。

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

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

最佳答案

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

在终端中,通过将 gravity 设置为 center 并指定距该位置的零偏移量,像这样将图像裁剪到中央 50x50 像素:

magick input.png -gravity center -crop 50x50+0+0 result.png

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

magick input.png -gravity center -crop "%[fx:h<w?h:w]x%[fx:h<w?h:w]+0+0" result.png

开始图片:

enter image description here

结果:

enter image description here

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

parallel magick {} -gravity center -crop ... {} ::: *.png

但是现在我们遇到了一些新问题。文件名列表对于 ARG_MAX 来说太长了,所以我们需要从 find 中将文件名输入到 stdin 中,像这样使用空终止符:

find . -name \*.png -print0 | parallel -0 magick {} -gravity center -crop ... {}

-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" {} 

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

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

parallel --bar ...

您可以做一个“试运行”,要求 GNU Parallel 向您展示它做什么,而无需实际做任何类似这样的事情:

parallel --dry-run ...

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

关于python - 在 python 中中心裁剪图像的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51281913/

相关文章:

html - 如何使用 HTML 和 CSS 更改图像?

python - tensorflow 中 tf.estimator.DNNRegressor 的平均损失与 MSE 相同吗?

python - Keras 调谐器 : mismatch between number of layers used and number of layers reported

python - 我可以在我的 Mac 上生成一个可以在 Windows 上使用的 python 可执行文件吗

python - 如何获取URL缩短页面的结果值?

Java 图像复制在 Windows 上正常,但在 Linux 上已更改

python - 为什么我的 Tensorboard 图中所有内容都断开连接?

python - 对起点和终点字符串列表进行排序

python - 当我将符号添加到具有 textVariable 的标签时

Android 退出时清除图像内存缓存