【问题标题】:Can you loop through pixels in an image without loading the whole image?您可以在不加载整个图像的情况下遍历图像中的像素吗?
【发布时间】:2013-02-01 10:11:57
【问题描述】:

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

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

【问题讨论】:

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

标签: python matplotlib scipy


【解决方案1】:

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 或其他东西可以做到的话,安装一个专门用于阅读的包可能有点过分了。但它是一个强大的选择,我已经处理了像这样的 30000*30000 像素的图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2015-07-20
    • 2016-12-02
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多