2012-07-20 366 views
2

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

我尝试使用PIL + Numpy和GDAL + Numpy等读取SRTM(航天飞机雷达地形测绘任务)。我只需要一小块,因此我使用ArcGIS获取我需要的范围作为tif文件。

但是,虽然上面的测试,数组中的值是不正确的。 例如,我在海拔范围从136到737的CA中使用了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

你可以发布你的代码和结果吗? – 2012-07-20 00:34:13

+1

你正在使用什么格式的文件?快速浏览SRTM网站可以看到它提供了多种格式。 – Mark 2012-07-20 00:37:21

+0

我认为tif文件没有GDAL_NODATA标记。 – Vicky 2012-07-20 15:37:32

回答

0

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

+0

我试图将负值设置为零,并发现右侧的一些像素为零。也就是说,我只是读了部分图片。为什么会发生这种情况? – Vicky 2012-07-27 15:22:35