在Python中处理大型(可能超过30000x30000)图像?

在Python中处理大型(可能超过30000x30000)图像?,python,image,python-imaging-library,Python,Image,Python Imaging Library,我试图使用一个名为deepzoom.py的python脚本将大开销渲染(通常超过1GP)转换为deepzoom图像格式(即google maps-esque tile格式),但不幸的是,它是由PIL支持的,由于内存限制,PIL通常会崩溃。创建者说他正在钻研VIP,但即使是nip2(VIP的GUI前端)也无法打开图像。在其他人提出的另一个问题中(尽管是在同一主题上),有人建议,看起来它有这个功能,并且有Python包装器,但是没有提供任何合适的二进制文件,并且试图在Windows上编译它是一场噩梦

我试图使用一个名为deepzoom.py的python脚本将大开销渲染(通常超过1GP)转换为deepzoom图像格式(即google maps-esque tile格式),但不幸的是,它是由PIL支持的,由于内存限制,PIL通常会崩溃。创建者说他正在钻研VIP,但即使是nip2(VIP的GUI前端)也无法打开图像。在其他人提出的另一个问题中(尽管是在同一主题上),有人建议,看起来它有这个功能,并且有Python包装器,但是没有提供任何合适的二进制文件,并且试图在Windows上编译它是一场噩梦


我可以使用Python的其他库吗?我试过PythonMagickWand(ImageMagick的包装器)和PythonMagick(GraphicsMagick的包装器),但这两种方法都会遇到内存问题。

听起来你好像在尝试使用地理参考图像或类似的东西,而GIS解决方案听起来更合适。我会使用——它是一个优秀的库,通过Swig提供易于使用的Python绑定


在Windows上,最简单的安装方法是通过Frank Warmerdam的软件包。

部分加载有用吗?如果您使用PIL,并且图像格式为.BMP:您可以打开()一个图像文件(不加载它),然后执行裁剪(),然后加载-这将实际加载裁剪选择的图像部分。可能还可以使用TGA,甚至可以用于JPG,而对于PNG和其他格式,效率较低。

我遇到了一个非常类似的问题,我最终使用netpbm解决了这个问题,netpbm在windows上运行良好。Netpbm在转换巨大的.png文件,然后进行切片、裁剪、重新组合(使用pamcrop、pamdice和pamundice)并将其转换回.png时没有任何问题,而且根本不需要占用太多内存。我只是在应用程序中包含了必要的netpbm二进制文件和DLL,并从python中调用了它们

配备了一个非常快速的DeepZoom creator,可以处理任何大小的图像。尝试:

$ vips dzsave huge.tif mydz
将瓷砖写入
mydz_文件
,并为您写入
mydz.dzi
info文件。它通常比
deepzoom.py
快10倍,并且没有大小限制

有关
dzsave
的介绍,请参阅

您可以使用以下方法从Python执行相同的操作:

导入pyvips
my_image=pyvips.image.new_from_文件(“mage.tif”,access=“sequential”)
myu image.dzsave(“mydz”)
access=“sequential”
告诉pyvips它可以流式传输图像,而不必将整个内容读取到内存中。

我可以使用它读取大小为(50000、50000、3)的图像:


是什么阻止您使用Linux for OpenImageIO?获取一个小型外部硬盘并安装它(或一个未使用的内部硬盘)。我也相信你的系统规格能胜任这项任务。你可以试着把它分割成更小的图像,然后把它们转换成我之前试过的那样,但没有成功,尽管我没有做太多正确的设置。也许这听起来很可笑,但我认为如果我尝试在Windows上运行脚本,它将不兼容。这太完美了。甚至似乎也加入了金字塔创建工具,这是一个加号。干杯嗯,显然不是。GDAL依赖于libjpeg,它在尝试打开图像时返回“内存不足”。也许我需要(以某种方式)将其转换为原始格式,然后才能使用它。我将尝试在linux虚拟机上编译,看看它是如何运行的。@Nicolas:嗯。。。我知道GDAL能够处理太大而无法存储的图像。我没有广泛使用JPEG驱动程序,因此我无法对此发表评论,但我希望您在使用原始格式时会取得更好的成功。您可以在非python预处理器中分割图像吗。把它们分成1k x 1k块?
img = pyvips.Image.new_from_file('xxx.jpg')
arr = np.ndarray(buffer=img.write_to_memory(),
                  dtype=np.uint8,
                  shape=[img.height, img.width, img.bands])