使用Python调整大图像(大于可用RAM)

时间:2017-06-21 15:37:43

标签: python image image-processing imagemagick gdal

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

有哪些可用的库可以执行此操作?我正在看GDAL,但它产生了非常模糊的输出,我无法设置它更好地插值。理想情况下,我会考虑使用Lanczos插值器进行此类任务。

是否有可以执行此操作的基于C的库的本机Python库或包装器? imagemagick的Python包装器可以做这样的事吗?

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

1 个答案:

答案 0 :(得分:8)

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更快,并且需要更少的内存。