Python 你能在不加载整个图像的情况下循环图像中的像素吗?

Python 你能在不加载整个图像的情况下循环图像中的像素吗?,python,matplotlib,scipy,Python,Matplotlib,Scipy,我有一些非常大的图像。我不想将整个图像加载到内存中,我只想按行顺序对图像进行一次遍历。在Python/scipy中可以这样做吗 编辑:我正在使用.PNG,但我可以将它们转换为PPM、BMP或其他无损格式 (使用Python绑定)为此提供了一些非常好的驱动程序。尽管它是一个地理空间软件包,但它可以很好地处理BMP和PNG。此示例显示如何逐行加载PNG: import gdal # only loads the dataset ds = gdal.Open('D:\\my_large_image.

我有一些非常大的图像。我不想将整个图像加载到内存中,我只想按行顺序对图像进行一次遍历。在Python/scipy中可以这样做吗

编辑:我正在使用.PNG,但我可以将它们转换为PPM、BMP或其他无损格式

(使用Python绑定)为此提供了一些非常好的驱动程序。尽管它是一个地理空间软件包,但它可以很好地处理BMP和PNG。此示例显示如何逐行加载PNG:

import gdal

# only loads the dataset
ds = gdal.Open('D:\\my_large_image.png')

# read 1 row at the time
for row in range(ds.RasterYSize):
    row_data = ds.ReadAsArray(0,row,ds.RasterXSize,1)

ds = None # this closes the file
因此,它将为您提供一个Numpy数组,以便进行处理。你可以用类似的方式写出任何结果

print type(row_data)
<type 'numpy.ndarray'>

print row_data.shape
(3, 1, 763)

print row_data
[[[  0   0 255 ..., 230 230   0]]

 [[  0   0 252 ..., 232 233   0]]

 [[  0   0 252 ..., 232 233   0]]]
打印类型(行数据)
打印行\ u data.shape
(3, 1, 763)
打印行数据
[[[  0   0 255 ..., 230 230   0]]
[[  0   0 252 ..., 232 233   0]]
[[  0   0 252 ..., 232 233   0]]]

如果PIL或其他东西能够做到这一点,那么安装一个特定于读取的包可能有点过头了。但这是一个稳健的选择,我处理过30000*30000像素的图像,就像这样。

在很多情况下,是的,但这取决于图像的格式和你用来读取图像的库。你的图像是什么格式的?我正在使用.PNG file format.TIFF,这会使它特别容易,但我认为PIL不支持按波段读取TIFF。