可以不加载整张图片就循环遍历像素吗?
我有一些非常大的图片。我不想把整张图片都加载到内存里,我只想按照行的顺序一次性处理一行。请问在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像素的图片。