你可以在不加载整个图像的情况下遍历图像中的像素吗?

nic*_*ine 5 python matplotlib scipy

我有一些非常大的图像.我不想将整个图像加载到内存中,我只想按行顺序对图像进行单次传递.是否可以在Python/scipy中执行此操作?

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

Rut*_*ies 3

GDAL(带有 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
Run Code Online (Sandbox Code Playgroud)

它会为您提供一个 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]]]
Run Code Online (Sandbox Code Playgroud)

如果 PIL 或其他东西可以做到这一点,那么安装专门用于读取的包可能有点大材小用。但它是一个强大的选择,我已经像这样处理过 30000*30000 像素的图像。