在Python中调整大型图像的大小(大于可用RAM)

在Python中调整大型图像的大小(大于可用RAM),python,image,image-processing,imagemagick,gdal,Python,Image,Image Processing,Imagemagick,Gdal,我想将巨大(1 TB)的图像调整大小并拆分为256x256像素的分幅(Zoomify/OSM/Google Maps/XYZ模式)。图像将采用BigTIFF或PSB(大文档格式或Photoshop大)格式 有哪些可用的库可以做到这一点?我正在看GDAL,但它的输出非常模糊,我无法将其设置为更好的插值。理想情况下,我会为这样的任务寻找一个Lanczos插值器 是否有任何本机Python库或基于C的库的包装器可以做到这一点?imagemagick的Python包装器可以做这样的事情吗 如果没有可用的

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

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

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

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

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

dzsave
操作符将编写一个DeepZoom/Zoomify/googlemaps金字塔。您可以从命令行运行它,如下所示:

$ 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的图像转换为230000个瓷砖。这是一个机械硬盘,它可能会更快的SSD。有一个

它有,所以你也可以写:

import pyvips

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

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

如果没有更好的方法,你可以选择spark分布式计算路线。ImageMagick可以使用-crop操作符实现这一点。请参见第页的“瓷砖裁剪”部分。我相信还有Python ImageMagick API和Python Wand。我建议您看看
VIP
,也许它的作者John(@user894763)会有一些建议。输入图像和输出图像的格式是什么。。。。在类似小波的情况下,MrSID在处理过程中内存有限,分辨率可能会影响结果质量。它也可能是有损压缩的输出问题,而不是错误的调整大小过滤器。。。尝试从较小的裁剪图像中进行平铺,以查看是否检查此问题更好。@Spektre我已将文件格式添加到问题中。回答得很好!我已经忘记了libvips,并且已经开始考虑一些自定义代码。如何将瓷砖合并回比可用RAM更大的原始图像中?您能解释更多吗?你想把大量的瓷砖拼接在一起形成一个巨大的图像吗?我想问一个新问题,但这可能会有所帮助: