大卫星图像处理

2024-06-26 13:28:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在双时态RapidEye多光谱图像上运行mortconty的http://mcanty.homepage.t-online.de/pythonimad实现。它基本上是计算两幅图像的典型相关,然后对它们进行减除。我的问题是 图像是5000 x 5000 x 5(波段)像素。如果我试着运行这个 整个图像我得到一个记忆错误。在

使用pyTables之类的东西能帮助我吗?在

mortconty的代码尝试使用gdal加载图像,然后存储它们 在一个10 x 25000000阵列中。在

    # 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 25000000 numpy的float数组,也会引发内存错误。有人知道如何避开这个问题吗?这是我有史以来的第一个帖子,所以任何关于如何发帖的建议都将受到欢迎。在

你好


Tags: 图像错误dmfloatrowscolsbandsastype
1条回答
网友
1楼 · 发布于 2024-06-26 13:28:50

numpy在默认情况下使用float64,因此您的dm-数组占用2GB内存(8*10*25000000),其他数组每个可能约为200MB(~8*5000*5000)。

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

for循环中使用的内存何时释放取决于垃圾回收。这并没有考虑GetRasterBandReadAsArray的内存开销。

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

相关问题 更多 >