在python中读取16位或32位图像

在python中读取16位或32位图像,python,image,Python,Image,如何通过python读取16位或32位图像,并以数组的形式获得正确的图像值 我试着使用PIL+Numpy和GDAL+Numpy等工具读取SRTM(航天飞机雷达地形图任务)。我只需要一小块,所以我使用ArcGIS获取我需要的范围作为tif文件 但是,尽管进行了上述测试,但数组中的值不正确。 例如,我在CA中使用了一个SRTM,其高程范围为136到737,但当我使用numpy获取最大值和最小值时,数组值范围为-3.40到737,并且它显示了大量负值。 我能做什么?我会犯一些错误吗 使用ipython

如何通过python读取16位或32位图像,并以数组的形式获得正确的图像值

我试着使用PIL+Numpy和GDAL+Numpy等工具读取SRTM(航天飞机雷达地形图任务)。我只需要一小块,所以我使用ArcGIS获取我需要的范围作为tif文件

但是,尽管进行了上述测试,但数组中的值不正确。 例如,我在CA中使用了一个SRTM,其高程范围为136到737,但当我使用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

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

你能发布你的代码和结果吗?你使用的文件是什么格式的?快速浏览一下SRTM网站,我发现它有多种格式。我认为tif文件没有GDAL_NODATA标记。我尝试将负值设置为零,发现右侧的一些像素为零。也就是说,我只是读了部分图片。为什么会出现这种情况?