Google Earth Engine如何将影像集合转换为像素值频率直方图
Google Colab 环境下 GEE 实现影像集区域像素频率直方图方案
- 环境初始化
先在Colab里完成GEE的依赖安装与账号授权,直接运行以下代码即可,初始化阶段替换成你自己的GEE项目ID。
# 安装Earth Engine依赖 !pip install earthengine-api -q import ee import pandas as pd import matplotlib.pyplot as plt from google.colab import auth # 完成GEE账号授权 auth.authenticate_user() # 初始化GEE环境 ee.Initialize(project='替换为你的GEE项目ID')
- 研究区与影像集配置
先划定要统计的目标区域,再加载对应时相、对应数据源的卫星影像集,提前做好去云、非作物区域掩膜等预处理,避免无关像素干扰统计结果。以下示例以作物生长季MODIS NDVI影像集、作物主产区为演示场景,可按需替换为自有研究区资产、Sentinel-2/Landsat等其他数据源。
# 定义研究区,可替换为上传到GEE资产的自有边界 roi = ee.FeatureCollection("TIGER/2018/States").filter(ee.Filter.eq('NAME','Illinois')).geometry() # 影像集预处理函数:去云、裁剪研究区 def img_preprocess(img): qa = img.select('SummaryQA') valid_mask = qa.bitwiseAnd(3).eq(0) # 剔除非优质观测像素 return img.updateMask(valid_mask).select('NDVI').clip(roi) # 加载目标时段影像集 dataset = ee.ImageCollection('MODIS/061/MOD13Q1')\ .filterDate('2020-06-01', '2020-09-30')\ .map(img_preprocess)
- 核心直方图统计
直接调用GEE内置的直方图聚合reducer即可实现全量像素统计,不需要逐影像遍历统计再合并,能避免统计口径偏差。参数里的分箱数、数值范围、统计分辨率可根据复现的论文要求调整,记得调大maxPixels阈值避免大区域统计时报错。
# 配置直方图统计参数 hist_config = { 'reducer': ee.Reducer.histogram( maxBuckets=256, # 直方图分箱数量,按需调整 minBucketWidth=0.001 # 最小分箱宽度,避免数值过密导致分箱异常 ), 'geometry': roi, 'scale': 250, # 与所用影像的原始空间分辨率保持一致 'maxPixels': 1e13, # 调大像素数阈值,避免大区域统计超限 'bestEffort': True } # 聚合统计区域内所有像素,拉取结果到本地 hist_result = dataset.reduce(**hist_config).getInfo()
- 结果解析与导出
返回的统计结果包含每个分箱的像素均值、对应像素计数,可直接转成结构化数据表,计算频率占比后用于后续机器学习模型的特征输入,也可以直接绘图核对分布形态。
# 提取目标波段的直方图结果 ndvi_hist = hist_result['NDVI'] hist_df = pd.DataFrame({ 'pixel_value': ndvi_hist['bucketMeans'], 'pixel_count': ndvi_hist['histogram'] }) # 计算频率占比 hist_df['frequency'] = hist_df['pixel_count'] / hist_df['pixel_count'].sum() # 可视化核对分布 plt.figure(figsize=(10,4)) plt.bar(hist_df['pixel_value'], hist_df['frequency'], width=0.01) plt.xlabel('Pixel value') plt.ylabel('Frequency') plt.title('Regional pixel value frequency histogram') plt.show() # 导出结果为CSV,可直接下载到本地用于后续建模 hist_df.to_csv('pixel_histogram.csv', index=False)
踩坑提示:
- 统计前务必确认影像已经做过对应掩膜,作物产量预测场景下要提前剔除非耕地区域、云遮挡像素,否则直方图分布会和论文结果出现明显偏差
- scale参数要和使用的影像原始空间分辨率保持一致,不要随意设得更小,否则会通过插值生成大量无效重复像素,干扰统计结果
- 如果影像集包含多个波段,统计前用
select()指定需要生成直方图的目标波段,减少不必要的计算开销- 单区域像素量过大时保持
bestEffort=True,GEE会自动调整采样逻辑避免任务超时
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

