如何在不将整个图像加载到内存的情况下将单个 TIF 图像分段加载到 Numpy 数组中?



所以有一个4GB .需要处理的TIF图像,作为内存限制,我无法将整个图像加载到numpy数组中,因此我需要从硬盘中延迟加载它。 所以基本上我需要,这需要在 python 中作为项目要求完成。我也尝试在 PyPi tifffile 中寻找 tifffile 库,但我没有发现任何有用的东西,请帮忙。

pyvips 可以做到这一点。例如:

import sys
import numpy as np
import pyvips
image = pyvips.Image.new_from_file(sys.argv[1], access="sequential")
for y in range(0, image.height, 100):
area_height = min(image.height - y, 100)
area = image.crop(0, y, image.width, area_height)
array = np.ndarray(buffer=area.write_to_memory(),
dtype=np.uint8,
shape=[area.height, area.width, area.bands])

new_from_fileaccess选项打开顺序模式:pyvips 将仅按需从文件中加载像素,但限制是您必须从上到下读取像素。

循环以 100 条扫描线的块向下运行图像。当然,你可以调整这个。

我可以像这样运行它:

$ vipsheader eso1242a-pyr.tif 
eso1242a-pyr.tif: 108199x81503 uchar, 3 bands, srgb, tiffload_stream
$ /usr/bin/time -f %M:%e ./sections.py ~/pics/eso1242a-pyr.tif
273388:479.50

因此,在这台可悲的旧笔记本电脑上,扫描 108,000 x 82,000 像素的图像需要 8 分钟,并且需要 270mb 的内存峰值。

你在做什么处理?你也许可以在pyvips中完成整个事情。它比麻比快得多。

import pyvips
img = pyvips.Image.new_from_file("space.tif", access='sequential')
out = img.resize(0.01, kernel = "linear")
out.write_to_file("resied_image.jpg")

如果您想将文件转换为其他格式,则尺寸较小,此代码就足够了,并且将帮助您在没有任何内存峰值的情况下在很短的时间内做到这一点......

相关内容

  • 没有找到相关文章

最新更新