2014-01-16 40 views
1

我正在寻找将卫星图像的像素值存储到数组中。我一直在使用用于创建具有numpy大阵列的最佳dtype

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文档中找到的单个dtype,但不断得到相同的结果。

numpy无法加载这么多值或有没有一种方法来优化数组?

我正在处理含有NDVI(十进制)值的8位tiff图像。

感谢

+0

“最好的dtype”是舒适地保存您的数据的那个。如果你有一堆8位像素,'uint8'可能是最好的dtype,但如果你有一堆32位浮点音频样本,它不会很好...... – abarnert

+0

@abarnert我使用的图像是8位tiff。当我使用uint8时仍然返回零.. – Dzinic

回答

1

不能肯定你想读什么类型的图像,但在的情况下,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或多少位的标题是,因此something:

A=open(filename,"r") 
B=numpy.fromfile(A,dtype='uint8')[something:].reshape(3858,3743) 
C=B*1.0 
A.close() 

编辑:问题是解决了使用64位的蟒蛇,而不是32位时,由于在2Gb的内存时的错误使用32位的Python版本。

+0

我正在使用包含NDVI信息的8位tiff图像。 – Dzinic

+0

@Dzinic什么是你的图像的来源? (编辑我的答案,以显示我以前使用过的另一件事,阅读图像,但不确定是否适用于.tiff)我的猜测是您使用的是landsat图像?在这种情况下,我想gdal应该有一个驱动程序 – usethedeathstar

+0

我不确定图像来自哪里,但我知道他们在5米的分辨率。我能够使用gdal正确加载它们,但似乎当脚本获取超过2GB的内存时,我收到一个“MemoryError”。不知道这是我的代码还是我正在使用的32位Python。 – Dzinic