在Python中读取16位或32位图像。

3

如何通过Python读取16位或32位图像并将正确的图像值作为数组获取?

我尝试使用PIL + Numpy和GDAL + Numpy等方法读取SRTM(航天飞机雷达地形测量)数据。我只需要一小部分,所以我使用ArcGIS将所需范围作为tif文件导出。

然而,经过上述测试之后,数组中的值是不正确的。例如,我使用了一个高程范围从136到737的加州SRTM数据,但是当我使用numpy获取最大和最小值时,数组值的范围是从-3.40到737,并且出现了许多负值。我该怎么办?是否犯了一些错误?

我在ipython中使用的代码如下:

import Image
import numpy as num
im=Image.open('srtm.tif')
imarray=num.array(im)
imarray
array([[ -3.40282347e+38,  -3.40282347e+38,   4.00000000e+02, ...,
      0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
   [ -3.40282347e+38,  -3.40282347e+38,   4.00000000e+02, ...,
      0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
   [ -3.40282347e+38,  -3.40282347e+38,   4.00000000e+02, ...,
      0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
   ...,
   [  0.00000000e+00,   0.00000000e+00,   0.00000000e+00, ...,
      0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
   [  0.00000000e+00,   0.00000000e+00,   0.00000000e+00, ...,
      0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
   [  0.00000000e+00,   0.00000000e+00,   0.00000000e+00, ...,
      0.00000000e+00,   0.00000000e+00,   0.00000000e+00]], dtype=float32)
import gdal
tif = gdal.Open('srtm.tif')
arr = tif.ReadAsArray()
arr
array([[ -3.40282347e+38,  -3.40282347e+38,   4.00000000e+02, ...,
     -3.40282347e+38,  -3.40282347e+38,  -3.40282347e+38],
   [ -3.40282347e+38,  -3.40282347e+38,   4.00000000e+02, ...,
      6.11000000e+02,   6.17000000e+02,   6.17000000e+02],
   [ -3.40282347e+38,  -3.40282347e+38,   4.00000000e+02, ...,
      6.11000000e+02,   6.17000000e+02,   6.17000000e+02],
   ...,
   [  1.50000000e+02,   1.50000000e+02,   1.48000000e+02, ...,
      1.73000000e+02,   1.73000000e+02,   1.73000000e+02],
   [  1.49000000e+02,   1.49000000e+02,   1.48000000e+02, ...,
      1.73000000e+02,   1.73000000e+02,   1.73000000e+02],
   [  1.49000000e+02,   1.49000000e+02,   1.48000000e+02, ...,
      1.73000000e+02,   1.73000000e+02,   1.73000000e+02]], dtype=float32)

num.max(arr)
737.0
num.min(arr)
-3.4028235e+38

2
你能发布你的代码和结果吗? - Austin Henley
1
你正在处理的文件是什么格式?快速查看SRTM网站,我发现它提供了多种格式。 - Mark
我认为这个tif文件没有GDAL_NODATA标签。 - Vicky Liau
1个回答

0

我猜这些数值实际上是正确的。许多科学图像形式使用特定的极高或极低值来表示空值或饱和像素。我的建议是在任何计算中不包括这些像素,或将它们设置为零,如:arr[arr < 0] = 0


我试图将负值设为零,并发现右侧的一些像素为零。也就是说,我只读取了图像的部分。为什么会出现这种情况? - Vicky Liau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接