python中快速生成多边形掩膜的方法

利用Sentinel-2 A/B、Landsat8、高分等多光谱遥感数据,生成长时序植被指数数据,是监测农作物生长的常见方法。进行时序分析时,为了从高维时序图像中的指定样本地块中快速提取数据,常采用编程的方式批量处理。gdal和rasterio都可以读取栅格数据,但是,两者进行读取的过程有区别。

图像进行分割后,生成大量的多边形,保存在shp文件中。然后需要计算每个多边形覆盖范围内的图像的纹理特征。gdal和rasterio都能读取shp文件,并访问指定多边形后生成掩膜后,再计算纹理特征。但是两者生成掩膜的过程和结果差别比较大,经过比较和分析,发现使用rasterio能够更快地生成合格的掩膜,相关代码如下:

import gdal

from shapely.Geometry import Polygon

from affine import Affine

raster = gdal.Open('p.tif')

shp = gdal.Open('p.shp')

lyr = shp.GetLayer()

feat = lyr.GetNextFeature()

# TODO: 使用rasterio和shapely处理多边形掩膜,速度快

# 将ogr.Geometry转换为shapely.Geometry.Polygon

geom = [feat.GetGeometryRef()]

geom_dict =eval(geom[0].ExportToJson())

geom = [Polygon(geom_dict['coordinates'][0]).__geo_interface__]

# TODO: rasterio不支持gdal形式的transform,转换为Affine

transform = raster.GetGeoTransform()

pixelWidth = transform[1]

pixelHeight = transform[5]

transform = Affine.from_gdal(xmin, pixelWidth, 0, ymax, 0, pixelHeight)

datamask = np.logical_not(features.geometry_mask(geom, [xcount, ycount], transform))

datamask就是多边形生成的掩膜,用它就可以计算多边形覆盖范围内的图像的各种特征,比如均值,方差,各种纹理特征,等等

你可能感兴趣的:(python中快速生成多边形掩膜的方法)