我希望将卫星图像中的像素值存储到数组中。我一直在使用
np.empty((image_width, image_length)
它适用于图像的较小子集,但是当在整个图像(3858 x 3743)上使用它时,代码很快终止,我得到的只是一个零数组。
我使用循环将图像值加载到数组中并使用 gdal 打开图像
img = gdal.Open(os.path.join(fn + "\{0}".format(fname))).ReadAsArray()
但是当我包含 print img_array
时,我最终只得到零。
我几乎尝试了 numpy 文档中可以找到的所有数据类型,但始终得到相同的结果。
numpy 无法加载这么多值还是有办法优化数组?
我正在处理包含 NDVI(十进制)值的 8 位 tiff 图像。
谢谢
最佳答案
不确定您要尝试读取什么类型的图像,但对于 Radarsat-2 图像,您可以执行以下操作:
dataset = gdal.Open("RADARSAT_2_CALIB:SIGMA0:" + inpath + "product.xml")
S_HH = dataset.GetRasterBand(1).ReadAsArray()
S_VV = dataset.GetRasterBand(2).ReadAsArray()
# gets the intensity (Intensity = re**2+imag**2), and amplitude = sqrt(Intensity)
self.image_HH_I = numpy.real(S_HH)**2+numpy.imag(S_HH)**2
self.image_VV_I = numpy.real(S_VV)**2+numpy.imag(S_VV)**2
但这专门针对该类型的图像(在这种情况下,每个图像包含多个波段,因此我需要使用 GetRasterBand(i)
分别读取每个波段,而不是 ReadAsArray()
如果有一个特定的 GDAL 驱动程序适合您要读入的图像类型,那么生活就会变得非常容易
如果您提供有关您想要阅读的图像类型的更多信息,我也许可以提供更具体的帮助
编辑:你尝试过这样的事情吗? (不确定这是否适用于 tiff,或者 header 有多少位,因此 something:
)
A=open(filename,"r")
B=numpy.fromfile(A,dtype='uint8')[something:].reshape(3858,3743)
C=B*1.0
A.close()
编辑:当使用 64 位 python 而不是 32 位时,问题得到解决,因为使用 32 位 python 版本时 2Gb 时出现内存错误。
关于python - 使用 numpy 创建大型数组的最佳数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21172240/