Skip to main content
 首页 » 编程设计

python之大卫星图像处理

2025年05月04日10飞鱼

我正在尝试运行 Mort Canty 的 http://mcanty.homepage.t-online.de/ Python iMAD 在双时态 RapidEye 多光谱图像上的实现。这基本上计算了两个图像的典型相关性,然后将它们相减。我遇到的问题是 图像为 5000 x 5000 x 5( strip )像素。如果我尝试运行它 整个图像出现内存错误。

使用像 pyTables 这样的东西可以帮助我解决这个问题吗?

Mort Canty 的代码试图做的是它使用 gdal 加载图像然后存储它们 在 10 x 25,000,000 数组中。

    # initial weights 
    wt = ones(cols*rows)       
    # data array (transposed so observations are columns) 
    dm = zeros((2*bands,cols*rows)) 
    k = 0 
    for b in pos: 
    band1 = inDataset1.GetRasterBand(b+1) 
    band1 = band1.ReadAsArray(x0,y0,cols,rows).astype(float) 
    dm[k,:] = ravel(band1) 
    band2 = inDataset2.GetRasterBand(b+1) 
    band2 = band2.ReadAsArray(x0,y0,cols,rows).astype(float)         
    dm[bands+k,:] = ravel(band2) 
    k += 1 

即使只是创建一个 10 x 25,000,000 numpy float 组也会引发内存错误。任何人都知道如何解决这个问题?这是我的第一篇文章,因此也欢迎任何关于如何发表的建议。

问候

请您参考如下方法:

numpy 默认使用 float64,因此您的 dm-array 占用 2GB 内存(8*10*25000000),另一个每个数组大约 200MB (~8*5000*5000)。

astype(float) 返回一个新数组,因此您也需要内存 - 甚至可能不需要,因为在将数据复制到结果数组时会隐式转换类型。

for 循环中使用的内存何时被释放取决于垃圾收集。这还没有考虑 GetRasterBand、ReadAsArray 的内存开销。

您确定您的输入数据使用 64 位 float 吗?如果它使用 32 位 float ,您可以通过在数组上指定 dtype='f' 轻松地将内存使用减半。