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

利用Sentinel-2 A/B、Landsat8、高分等多光譜遙感數(shù)據(jù),生成長時序植被指數(shù)數(shù)據(jù),是監(jiān)測農(nóng)作物生長的常見方法。進行時序分析時,為了從高維時序圖像中的指定樣本地塊中快速提取數(shù)據(jù),常采用編程的方式批量處理。gdal和rasterio都可以讀取柵格數(shù)據(jù),但是,兩者進行讀取的過程有區(qū)別。

圖像進行分割后,生成大量的多邊形,保存在shp文件中。然后需要計算每個多邊形覆蓋范圍內(nèi)的圖像的紋理特征。gdal和rasterio都能讀取shp文件,并訪問指定多邊形后生成掩膜后,再計算紋理特征。但是兩者生成掩膜的過程和結(jié)果差別比較大,經(jīng)過比較和分析,發(fā)現(xiàn)使用rasterio能夠更快地生成合格的掩膜,相關(guān)代碼如下:

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轉(zhuǎn)換為shapely.Geometry.Polygon

geom = [feat.GetGeometryRef()]

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

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

# TODO: rasterio不支持gdal形式的transform,轉(zhuǎn)換為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就是多邊形生成的掩膜,用它就可以計算多邊形覆蓋范圍內(nèi)的圖像的各種特征,比如均值,方差,各種紋理特征,等等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容