大卫星图像处理

时间:2012-05-14 06:34:41

标签: python satellite-image large-data bigdata

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

使用像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浮点数组也会引发内存错误。任何人都知道怎么解决这个问题?这是我的第一篇文章,所以任何有关如何发布的建议也会受到欢迎。

问候

1 个答案:

答案 0 :(得分:1)

numpy默认使用float64,因此您的dm - 阵列占用2GB内存(8 * 10 * 25000000),其他阵列可能大约200MB(~8 * 5000) * 5000)每个。

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

当释放for循环中使用的内存取决于垃圾回收。这不考虑GetRasterBandReadAsArray的内存开销。

您确定您的输入数据使用64位浮点数吗?如果它使用32位浮点数,则可以通过在数组上指定dtype='f'来节省一半的内存使用量。