人人都说我丑,其实我只是美得不明显。
作者: 赵博 • 2009 年 4 月 14 日 • 技术主义 • 一条评论
我越发从大多数程序员觉得丑陋的cmd.exe中找到美感。 也许是ipython让我感受到了这一点。就像geosalon的sunng经常说,“我不是一个在乎外表的人,所以他会选择有内涵的终端而不是倾向于UI的美丑”。
今晚要和大家分享一下用python-gdal和numpy做图像分析的一点小小的总结。比如,我做栅格处理,每个栅格的值域到底在什么范围比较好,换句话说采取什么数据类型会比较恰当。实际工作中,大体上有这么一个思路,比如,表示土地利用分类的栅格数据,用uint8(0~255)比较好而至于其他栅格数据,比如DEM,栅格打分数据,可能用float会比较好。因为我觉得栅格数据尽量要有一定的实际意义,这样一来,使用者也会省去不少力气,减少了误差和计算中的失误。
但是说到python-gdal和numpy的结合还是要注意以下几点,也就是说,在声明数据类型的时候,numpy和gdal用的是不同的声明变量,所以要pay attention一下几个部分,
#uint8 则表示值域在0~256,如果为浮点型,应该使用numpy.float32 result = numpy.zeros((height, width), dtype=numpy.uint8) for j in range(height): for i in range(width): if 255 == caresult[j][i]: #设置nodatavalue,一般而言都是设置该值域的最小值,但是uint8最小为0, #所以一般设置为255,而若为float32,则使用值域最小值, #我觉得也可以使用-1,毕竟在我这个应用中不可能有负数出现。 result[j][i] = 255 continue #注意如果要变为整形,则int(number),如果为float32则不需要。 result[j][i] = int(255*(0.25* road[j][i] + 0.2 * vcity[j][i] + 0.2 * tam[j][i] + 0.25 * float(caresult[j][i]))) driver = gdal.GetDriverByName('GTiff') #注意这里,gdal.GDT_Float32 对应的是numpy.float32, 而numpy.uint8 对应的是gdal.GDT_Byte out = driver.Create("output.tif", width,height, 1, gdal.GDT_Byte) outtx = list(ds.GetGeoTransform()) out.SetGeoTransform(outtx) out.SetProjection(ds.GetProjection()) outband = out.GetRasterBand(1) #outband.SetNoDataValue(result.band.GetNoDataValue()) #outband.SetNoDataValue(-1.0), 设置nodatavalue outband.SetNoDataValue(255) #outdata = result.astype(numpy.float32).tostring(),这个记住就行了。 outdata = result.astype(numpy.uint8).tostring() # gdal.GDT_Byte, gdal.GDT_Float32 outband.WriteRaster(0, 0, out.RasterXSize, out.RasterYSize, outdata, buf_type=gdal.GDT_Byte)
当时在做这里的时候,尝试过使用 numpy.float 或者numpy.int 都会因为和gdal.GDT_XXX长度不统一的问题产生错误,我不想多实验了,至少我上述两个类型就能解决大部分问题。其他的问题,只要确定一点,那就是说数据类型的长度相同,我想都不会有问题。 同时,还有一点,numpy.uint8 有助于可视化。
Reference:
1) http://www.scipy.org/Tentative_NumPy_Tutorial (This is called upcasting and it’s ruled by the following table. )
2) the sample hillshade.py from python-gdal samples.
相关文章:

初学python的路过一下:)