Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不将整个图像加载到内存的情况下将单个tif图像部分加载到numpy阵列中?_Python_Numpy_Image Processing_Python Imaging Library_Vips - Fatal编程技术网

Python 如何在不将整个图像加载到内存的情况下将单个tif图像部分加载到numpy阵列中?

Python 如何在不将整个图像加载到内存的情况下将单个tif图像部分加载到numpy阵列中?,python,numpy,image-processing,python-imaging-library,vips,Python,Numpy,Image Processing,Python Imaging Library,Vips,因此有一个4GB.TIF图像需要处理,由于内存限制,我无法将整个图像加载到numpy阵列中,因此我需要从硬盘中缓慢地加载部分图像。 所以基本上我需要,这需要在python中作为项目需求来完成。我还尝试在PyPi中查找TIFF文件库,但没有发现任何有用的内容。请帮助。可以做到这一点。例如: import sys import numpy as np import pyvips image = pyvips.Image.new_from_file(sys.argv[1], access="sequ

因此有一个4GB.TIF图像需要处理,由于内存限制,我无法将整个图像加载到numpy阵列中,因此我需要从硬盘中缓慢地加载部分图像。 所以基本上我需要,这需要在python中作为项目需求来完成。我还尝试在PyPi中查找TIFF文件库,但没有发现任何有用的内容。请帮助。

可以做到这一点。例如:

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])
access
选项打开顺序模式: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
因此,在这台破旧的笔记本电脑上,扫描108000 x 82000像素的图像需要8分钟,峰值内存需要270mb

你在做什么?你也许可以用pyvips来做这一切。它比numpy快很多。

可以做到这一点。例如:

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])
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")
access
选项打开顺序模式: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
因此,在这台破旧的笔记本电脑上,扫描108000 x 82000像素的图像需要8分钟,峰值内存需要270mb

你在做什么?你也许可以用pyvips来做这一切。它比numpy快很多

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")
如果你想将文件转换成其他格式,并且有更小的大小,这段代码就足够了,它将帮助你在没有任何内存尖峰的情况下,在非常短的时间内完成它


如果您想将文件转换为其他格式,并且文件大小较小,那么这段代码就足够了,它可以帮助您在不占用任何内存的情况下,在非常短的时间内完成转换…

考虑使用
pyvips
-它在内存方面非常节省。也许可以添加
vip
标签来吸引合适的人。也尝试对你的处理更加明确。考虑使用<代码> PyviPS——它在记忆上是非常节俭的。也许可以添加
vip
标签来吸引合适的人。另外,请尝试更明确地说明您的处理。我从下载了一个1.6 GB的文件,它在内存使用方面没有任何峰值。因此,在转换之前,您不将其加载到numpy会更好。我从1.6 GB的文件下载了一个1.6 GB的文件,它在内存使用方面没有任何峰值。此外,在转换之前,您也不将其加载到numpy,这将非常有用更好的