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

时间:2012-07-20 00:23:34

标签: python image

如何通过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

1 个答案:

答案 0 :(得分:0)

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