【问题标题】:Resize huge images in Python (bigger than available RAM)在 Python 中调整大图像的大小(大于可用 RAM)
【发布时间】:2017-11-24 14:54:29
【问题描述】:

我想调整大 (1 TB) 图像的大小并将其拆分为 256x256 像素图块(Zoomify / OSM / Google Maps / XYZ 架构)。图像将采用 BigTIFF 或 PSB(大型文档格式或 Photoshop Big)格式。

有哪些可用的库可以做到这一点?我正在查看 GDAL,但它产生的输出非常模糊,我无法将其设置为更好地插值。理想情况下,我会为此类任务寻找 Lanczos 插值器。

是否有任何本机 Python 库或基于 C 的库的包装器可以做到这一点? imagemagick 的 Python 包装器可以做这样的事情吗?

如果没有可用的 Python 库,我也可以使用基于命令行的工具,我可以使用 Python 实现自动化。

【问题讨论】:

  • 如果没有更好的选择,您可以走火花分布式计算路线。
  • ImageMagick 可以使用 -crop 操作符来做到这一点。请参阅imagemagick.org/Usage/crop/#crop 的切片裁剪部分。我相信有 Python ImageMagick API 和 Python Wand。
  • 我建议你看看vipsvips.ecs.soton.ac.uk,也许它的作者John (@user894763) 会有一些建议。
  • 输入图像和输出图块的格式是什么......如果是像 MrSID 这样的小波,在处理分辨率期间内存有限会影响结果质量。也可能是输出问题的有损压缩而不是错误的调整大小过滤器...尝试从较小的裁剪图像中进行切片,看看是否更好地检查这一点。
  • @Spektre 我已将文件格式添加到问题中。

标签: python image image-processing imagemagick gdal


【解决方案1】:

libvips 可以有效地处理巨大(大于 RAM)的图像。它是一个流式图像处理库,因此它可以(在这种情况下)同时解压缩、调整大小、平铺和写入所有内容,而无需将整个图像放在内存中或需要任何临时文件。

dzsave 运算符将编写 DeepZoom / Zoomify / Google Maps 金字塔。您可以像这样从命令行运行它:

$ vipsheader y.tif
y.tif: 104341x105144 uchar, 3 bands, srgb, tiffload
$ ls -l y.tif
-rw-r--r-- 1 john john 32912503796 Jun 13 13:31 y.tif
$ time vips dzsave y.tif x
real    3m4.944s
user    9m21.372s
sys 7m20.232s
peak RES: 640mb
$ ls -R x_files/ | wc
 227190  227172 2784853

因此,在我的桌面上,它在大约 3 分钟内将 32GB 的图像转换为 230,000 个图块。那是机械硬盘,SSD可能更快。有一个chapter in the docs introducing dzsave

它有a Python binding,所以你也可以写:

import pyvips

image = pyvips.Image.new_from_file("y.tif", access="sequential")
image.dzsave("x")

access 选项告诉 libvips 它应该流式传输图像。它可以读取 BigTIFF 和 PSB。您会发现 BigTIFF 速度更快,并且需要更少的内存。

【讨论】:

  • 很好的答案!我已经忘记了 libvips,并且已经开始考虑一些自定义代码。
  • 如何将图块合并回大于可用 RAM 的原始图像?
  • 你能解释更多吗?您想将大量的图块连接在一起以形成巨大的图像吗?我会问一个新问题,但这可能会有所帮助:github.com/openseadragon/openseadragon/issues/…
猜你喜欢
  • 2016-11-19
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多