python - 使用 numpy 创建大型数组的最佳数据类型

标签 python arrays image-processing numpy gdal

我希望将卫星图像中的像素值存储到数组中。我一直在使用

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/

相关文章:

python - python中的多处理-在多个进程之间共享大对象(例如pandas数据框)

java - 无法将一系列 JPEG 图像编码为 MPEG 视频

python - 全局函数中的 Jinja2 框架变量

python - 如何强制 CMake 在特定目录中查找库?

javascript - 在 JavaScript (ES6) 中合并数组以形成数组数组

arrays - 你如何在 swift 中对结构数组进行排序

c# - 查找 int[] 数组的所有可能组合,在 C# 中受长度限制

image-processing - 以编程方式确定数码照片可能的清晰度的方法?

Python 图像处理 : Measuring Layer Widths from Electron Micrograph

python - python中的Mininet套接字编程