基于AIE平台的决策树算法下的贵州省黔东南州水稻提取

简介: 依据作物在不同物候期内卫星影像的光谱存在差异的特征和地形因子,可建立水稻提取算法,进行水稻提取。

决策树模型实现黔东南州水稻提取

依据作物在不同物候期内卫星影像的光谱存在差异的特征和地形因子,可建立水稻提取算法,进行水稻提取。

初始化环境

import aie

aie.Authenticate()
aie.Initialize()

指定需要检索的区域

feature_collection = aie.FeatureCollection('China_City') \
                        .filter(aie.Filter.eq('city', '黔东南苗族侗族自治州'))
region = feature_collection.geometry()

DEM处理


# 指定检索数据集,可设置检索的空间范围
elevation = aie.ImageCollection('JAXA_ALOS_AW3D30_V3_2') \
             .filterBounds(region)\
             .select(['DSM'])\
             .mosaic()\
             .clip(region)



map = aie.Map(
    center=feature_collection.getCenter(),
    height=800,
    zoom=7
)
vis_params = {
    'bands': 'DSM',
    'min': 100,
    'max': 2200,
    'palette': [
        '#0000ff', '#00ffff', '#ffff00', '#ff0000', '#ffffff'
    ]
}
map.addLayer(
    elevation,
    vis_params,
    'Elevation',
    bounds=elevation.getBounds()
)
map

黔东南州高程分布图

task = aie.Export.image.toAsset(elevation,'dem_qdn',30)
task.start()
## 坡度,下载aie还不能计算,我这里使用ArcGIS运算

slope = aie.Image('user/c7ec068793e54fccb9ba8692ed9d0b91').clip(region)


vis_params = {
    'min': 0,
    'max': 80,
    'palette': [
        '#0000ff', '#00ffff', '#ffff00', '#ff0000', '#ffffff'
    ]
}
map.addLayer(
    slope,
    vis_params,
    'slope',
    bounds=slope.getBounds()
)
map

黔东南州坡度分布图

这里说一下,我的谷歌浏览器上传影像数据,不知道为什么失败,我是用edge浏览器上传的,我把我的谷歌浏览器版本上传给了官方。

Landsat 8 数据处理

# 插秧期影像

# 指定检索数据集,可设置检索的空间和时间范围,以及属性过滤条件(如云量过滤等)
img1 = aie.ImageCollection('LANDSAT_LC08_C02_T1_L2') \
             .filterBounds(region) \
             .filterDate('2021-4-01', '2021-6-10') \
             .filter(aie.Filter.lte('eo:cloud_cover', 20.0))\
             .median()\
             .clip(region)
# print(img1.size().getInfo())

vis_params = {
    'bands': ['SR_B4', 'SR_B3', 'SR_B2'],
    'min': 8000,
    'max': 13000,
}
map.addLayer(
    img1,
    vis_params,
    'img1',
    bounds=img1.getBounds()
)
map
# 生长期影像


img2 = aie.ImageCollection('LANDSAT_LC08_C02_T1_L2') \
             .filterBounds(region) \
             .filterDate('2021-6-20', '2021-8-30') \
             .filter(aie.Filter.lte('eo:cloud_cover', 45.0))\


print(img2.size().getInfo())

img2 = img2.median().clip(region)


vis_params = {
    'bands': ['SR_B4', 'SR_B3', 'SR_B2'],
    'min': 8000,
    'max': 13000,
}
map.addLayer(
    img2,
    vis_params,
    'img2',
    bounds=img2.getBounds()
)
map

NDVI 计算

# NDVI扩大10,好比较
NDVI1 = img1.normalizedDifference(['SR_B5', 'SR_B4'])\
            .multiply(aie.Image.constant(10)).rename(['NDVI'])
NDVI2 = img2.normalizedDifference(['SR_B5', 'SR_B4'])\
            .multiply(aie.Image.constant(10)).rename(['NDVI'])
NDVI_diff = NDVI2.subtract(NDVI1).rename(['Diff'])
import numpy as np

scale = 1000

histogram = NDVI1.reduceRegion(aie.Reducer.histogram(2000), None, scale)
histogram_info = histogram.getInfo()
# print(histogram_info)


bucketKey = histogram_info['NDVI_range']
bucketValue = histogram_info['NDVI_counts']

key = np.array(bucketValue)
accSum = np.cumsum(key)
# print(accSum[20])
# print(accSum[-1])
accPercent = accSum / accSum[-1]
    
p2 = np.searchsorted(accPercent, 0.2)

min_ndvi = bucketKey[p2 + 1]
print('min_ndvi1:%f' % min_ndvi)

p98 = np.searchsorted(accPercent, 0.98)
max_ndvi = bucketKey[p98]
print('max_ndvi1:%f' % max_ndvi)

分析ndvi分布

提取规则

# 水稻提取规则集

## 水稻一般生长在海拔900m以下,坡度在20度以下
mask1 = elevation.lt(aie.Image.constant(900)).clip(region) 
mask2 = slope.lt(aie.Image.constant(20)).clip(region) 

## 水稻播种期NDVI一般在0.32至0.38,每个地方可能有差异
mask3 = NDVI1.gt(aie.Image.constant(3.2)).And(NDVI1.lt(aie.Image.constant(3.8)))

## 水稻生长期NDVI和播种期NDVI一般在-0.9至0.6,每个地方可能有差异
mask4 = NDVI_diff.gt(aie.Image.constant(-0.9)).And(NDVI_diff.lt(aie.Image.constant(0.6)))
rice = mask1.And(mask2).And(mask3).And(mask4)
mask_vis  = {
    'min': 0,
    'max': 1,
    'palette': ['#ffffff', '#008000']    # 0:白色, 1:绿色
}



map.addLayer(rice,mask_vis, 'wheat', bounds=region.getBounds())    # 绿色区域为水稻

水稻提取结果

task = aie.Export.image.toAsset(rice,'rice_extract',30)
task.start()

精度评价

这一部分在ArcGIS和Excel里面完成,查找统计年鉴可知黔东南州水稻种植面积S~1~=233 万亩,提取出来的面积S~2~= 252万亩,提取下来结果如表所示,总的来说还是比较粗糙,希望大家有更好的算法。
$$总体误差= \frac{\left | S2-S1 \right |}{S1} = \frac{\left | 252-233 \right |}{233}=8.1\%$$

模型构建器
提取面积

相关文章
|
1月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
49 1
|
9天前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
24 9
|
30天前
|
存储 SQL 消息中间件
B端算法实践问题之设计一套实时平台能力如何解决
B端算法实践问题之设计一套实时平台能力如何解决
27 1
|
1月前
|
机器学习/深度学习 算法 数据可视化
决策树算法介绍:原理与案例实现
决策树算法介绍:原理与案例实现
|
1月前
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
|
1月前
|
数据采集 机器学习/深度学习 算法
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
|
1月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【8月更文挑战第2天】决策树算法以其直观性和解释性在机器学习领域中独具魅力,尤其擅长处理非线性关系。相较于复杂模型,决策树通过简单的分支逻辑实现数据分类,易于理解和应用。本示例通过Python的scikit-learn库演示了使用决策树对鸢尾花数据集进行分类的过程,并计算了预测准确性。虽然决策树优势明显,但也存在过拟合等问题。即便如此,无论是初学者还是专家都能借助决策树的力量提升数据分析能力。
29 4
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
【7月更文挑战第19天】Trie树,又称前缀树,是优化字符串搜索的高效数据结构。通过利用公共前缀,Trie树能快速插入、删除和查找字符串。
69 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
|
2月前
|
机器学习/深度学习 数据采集 算法
Python实现GBDT(梯度提升树)回归模型(GradientBoostingRegressor算法)项目实战
Python实现GBDT(梯度提升树)回归模型(GradientBoostingRegressor算法)项目实战