顾及物候信息提取冬小麦面积(基于AI earth)

农业遥感

xDV2xH.png

农业遥感的一个基础方向是农作物分类,农作物分类的基础在于要了解农作物的生长周期,打个比方就是:

1.植物越绿,NDVI值越高

2.植物不绿了,NDVI值变低

3.植物的生长期、 成熟期、收割期,即植物是什么时候绿,什么时候黄。

NDVI = (近红外-红)/(近红外+红)

上个式子重点观察分子,也就是 近红外-红,用近红外波段和红波段的值来判断植物是否绿油油。

xDVgRe.png

背后的原理基于人眼对颜色的判别。首先说一个更基础的问题:正常的植物为什么是绿色的?那是因为植物会吸收蓝光和红光,对绿光不敏感,所以反射绿光,并且我们眼睛只对可见光敏感,看不见近红外波段之外的光。总之,正常植物大量反射近红外光,小量反射绿光,大量吸收蓝光和红光。

冬小麦的物候及分类策略

冬小麦,和其他植物不一样的地方在于,它是10月播种,这时慢慢变绿但总体不绿;过冬是保持期;生长期是次年的3月到4月,这个阶段慢慢变绿,而且是很绿;收获期是次年的5月到6月,这阶段植被黄了,甚至是秃了。

总结起来就是:

1.如果该像素是冬小麦,那么10月的影像中它的NDVI很低,但不完全低

2.如果该像素是冬小麦,那么3、4月的影像中它的NDVI逐渐变高、保持高值

3.如果该像素是冬小麦,那么5、6月的影像中它的NDVI逐渐变低

4.水体、建筑物的NDVI值全年为负值

简单的数学公式分类策略

把以上4点总结为数学公式,如果该像素为冬小麦,则该像素满足

根据冬小麦的物候再去区分常绿森林,如果该像素为冬小麦,该像素也满足

或许该像素满足

基于AI earth实现冬小麦提取

# 初始化
import aie

aie.Authenticate()
aie.Initialize()
# 定义矢量范围
feature_collection = aie.FeatureCollection('China_City') \
                        .filter(aie.Filter.eq('city', '许昌市'))
region = feature_collection.geometry()
# 分类规则
# 指定检索数据集,可设置检索的空间和时间范围,以及属性过滤条件(如云量过滤等)
def getl8_ndvi(startdate,enddate):
    dataset = aie.ImageCollection('LANDSAT_LC08_C02_T1_L2') \
                 .filterBounds(region) \
                 .filterDate(startdate, enddate) 
                 # .filter(aie.Filter.lte('eo:cloud_cover', 20.0))
    ndvi =  dataset.map(get_ndvi)  
    return ndvi

def get_ndvi(image):
    ndvi = image.normalizedDifference(['SR_B5', 'SR_B4'])
    return ndvi  

# 黄淮海地区冬小麦典型物候期。播种期 10-11月,旺长期3-4月,成熟期5-6月
NDVI_median = getl8_ndvi('2020-10-11', '2020-11-10').median().clip(region) 
NDVI_max = getl8_ndvi('2021-03-20', '2021-04-20').max().clip(region) 
NDVI_min = getl8_ndvi('2021-05-20', '2021-06-30').min().clip(region) 

# 冬小麦提取规则集
mask1 = NDVI_max.gt(aie.Image.constant(0.33))     # 过滤水体、不透水面、裸地等非植被区域
mask2 = NDVI_median.lt(aie.Image.constant(0.50))  # 过滤森林、春播作物

mask3 = NDVI_max.lte(aie.Image.constant(0.48))    # < 0.48存在
mask4 = NDVI_max.gt(aie.Image.constant(0.48))     # 区分植被区域和非植被区域,> 0.48 为植被区域


mask5 = NDVI_min.gt(aie.Image.constant(-0.12))    # 筛选冬小麦区域,成熟/收获期冬小麦植被指数下降
mask6 = NDVI_min.lt(aie.Image.constant(0.17))   
mask7 = NDVI_min.lt(NDVI_max.add(aie.Image.constant(0.5)))

wheat1 = mask1.And(mask2).And(mask3).And(mask5).And(mask6)
wheat2 = mask1.And(mask2).And(mask4).And(mask5).And(mask7)
wheat  = wheat1.add(wheat2).where((wheat1.add(wheat2)).gt(aie.Image.constant(0)),aie.Image.constant(1))

在AI earth 上可视化

map = aie.Map(
    center=region.getCenter(),
    height=800,
    zoom=7
)

vis_params = {
    'color': '#00FF00'
}

map.addLayer(
    region,
    vis_params,
    'region',
    bounds=region.getBounds()
)

mask_vis  = {
    'min': 0,
    'max': 1,
    'palette': ['#ffffff', '#008000']    # 0:白色, 1:绿色
}

ndvi_vis  = {
    'min': -0.2,
    'max': 0.6,
    'palette': ['#d7191c', '#fdae61', '#ffffc0', '#a6d96a', '#1a9641']
}

map.addLayer(NDVI_median,ndvi_vis, 'NDVI_median', bounds=region.getBounds())
map.addLayer(NDVI_max,ndvi_vis, 'NDVI_max', bounds=region.getBounds())
map.addLayer(NDVI_min,ndvi_vis, 'NDVI_min', bounds=region.getBounds())
map.addLayer(wheat,mask_vis, 'wheat', bounds=region.getBounds())    # 绿色区域为小麦

map

xDmgRU.png

xDm2zF.png

小结

云处理比传统处理是要快很多,可以把时间放在算法的实现上,而不是下载数据、处理数据等重复、繁琐的工作中。

参考:

《基于 Google Earth Engine 的淮河流域越冬作物种植面积制图》

打广告:个人公众号:《remote sensing》,关注点赞不吃亏呀,嘻嘻。