2017-06-21 62 views
1

我想调整大小并将巨大(1TB)的图像分割为256x256像素图块(Zoomify/OSM/Google Maps/XYZ模式)。图像将采用BigTIFF或PSB(大文档格式或Photoshop Big)格式。在Python中调整大图像(大于可用RAM)

什么是可以做到这一点的可用库?我正在看看GDAL,但它产生的输出很模糊,我不能将它设置得更好。理想情况下,我会考虑一个Lanczos内插器来完成这个任务。

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

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

+1

如果你没有找到更好的选择,你可以走火花分布的计算路线。 –

+1

ImageMagick可以通过-crop操作符来实现。请参阅http://www.imagemagick.org/Usage/crop/#crop上的切片部分。我相信有Python ImageMagick API和Python Wand。 – fmw42

+0

我建议你看看'vips' http://www.vips.ecs.soton.ac.uk,也许它的作者约翰(@ user894763)会有一些建议。 –

回答

4

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的图像23万片。这是与一个机械硬盘,它可能会更快与SSD。有一个blog post introducing dzsave

a Python binding,所以你也可以这样写:

import pyvips 

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

access选项告诉libvips,它应该流中的图像。它可以阅读BigTIFF和PSB,但您会发现TIFF加载器速度更快。

+0

伟大的答案!我忘记了libvips,并已开始思考一些自定义代码。 – jsbueno