可以不加载整张图片就循环遍历像素吗?

5 投票
1 回答
915 浏览
提问于 2025-04-17 16:06

我有一些非常大的图片。我不想把整张图片都加载到内存里,我只想按照行的顺序一次性处理一行。请问在Python或scipy中可以做到这一点吗?

补充说明:我现在使用的是.PNG格式,但我可以把它们转换成PPM、BMP或者其他无损格式。

1 个回答

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

这个方法会给你一个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]]]

如果只是为了读取图片,安装一个专门的工具包可能有点多余,因为像PIL这样的库也能做到。不过,GDAL是一个很稳健的选择,我用它处理过30000*30000像素的图片。

撰写回答