• 人人都说我丑,其实我只是美得不明显。

    作者:  • 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.

    相关文章:

    关于

    生于古城長安,求學金陵,輾轉赴美深造,現漂泊於長安與北京。

    http://www.yenching.org