【问题标题】:Dealing with huge (potentially over 30000x30000) images in Python?在 Python 中处理巨大的(可能超过 30000x30000)图像?
【发布时间】:2020-11-23 21:41:48
【问题描述】:

我正在尝试使用名为 deepzoom.py 的 python 脚本将大型开销渲染(通常超过 1GP)转换为 Deep Zoom 图像格式(即,谷歌地图式平铺格式),但不幸的是它由 PIL 提供支持,由于内存限制,通常最终会崩溃。创建者说他正在研究 VIPS,但即使是 nip2(VIPS 的 GUI 前端)也无法打开图像。在其他人提出的另一个问题中(虽然在同一主题上),有人建议OpenImageIO,它看起来有能力,并且有 Python 包装器,但没有提供任何合适的二进制文件,并试图在 Windows 上编译它是一场噩梦。

我可以使用其他 Python 库吗?我已经尝试过 PythonMagickWand(ImageMagick 的包装器)和 PythonMagick(GraphicsMagick 的包装器),但它们都遇到了内存问题。

【问题讨论】:

  • 是什么阻止了您将 Linux 用于 OpenImageIO?获取一个小型外部硬盘驱动器并将其安装(或未使用的内部驱动器)。我也相信您的系统规格能够胜任这项任务。您可以尝试将其拆分为较小的图像并进行转换
  • 我之前曾尝试过,但没有成功,尽管我没有做太多正确设置。也许这听起来很荒谬,但我认为如果我尝试在 Windows 上运行脚本,它将不兼容。

标签: python image python-imaging-library


【解决方案1】:

我有一个非常相似的问题,我最终通过使用 netpbm 解决了它,它在 Windows 上运行良好。 Netpbm 可以毫无问题地转换巨大的 .png 文件,然后切片、裁剪、重新组合(使用 pamcrop、pamdice 和 pamundice)并转换回 .png,而完全不使用太多内存。我只是在我的应用程序中包含了必要的 netpbm 二进制文件和 dll,并从 python 调用它们。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 太完美了。 Even 似乎也包含了金字塔创建工具,这是一个优点。干杯!
    • 嗯,显然不是。 GDAL 依赖于 libjpeg,它在尝试打开图像时返回“内存不足”。也许我需要(以某种方式)将其转换为原始格式,然后才能对其进行任何操作。我将尝试在 linux VM 上编译,看看效果如何。
    • @Nicolas:嗯...我知道 GDAL 能够处理太大而无法放入内存的图像。我没有广泛使用 JPEG 驱动程序,因此无法对此发表评论,但我希望您使用原始格式会取得更好的成功。
    • 你能不能在非 python 预处理器中分块图像。将它们分成 1k x 1k 的瓷砖?
    【解决方案3】:

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

    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])
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        libvips 带有一个非常快速的 DeepZoom 创建器,可以处理任何尺寸的图像。试试:

        $ vips dzsave huge.tif mydz
        

        将磁贴写入mydz_files 并为您写入mydz.dzi 信息文件。它通常比 deepzoom.py 快 10 倍,并且没有大小限制。

        请参阅this chapter in the manual 了解dzsave 的介绍。

        您可以使用pyvips 在 Python 中执行相同的操作,如下所示:

        import pyvips
        
        my_image = pyvips.Image.new_from_file("huge.tif", access="sequential")
        my_image.dzsave("mydz")
        

        access="sequential" 告诉 pyvips 它可以流式传输图像,而不必将整个内容读入内存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-20
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 2011-06-19
          • 1970-01-01
          相关资源
          最近更新 更多