在遥感影像处理领域,Landsat 8 数据因其 30 米空间分辨率 和 多光谱波段 被广泛应用。处理这些数据时,研究者常常需要对数据进行裁剪、计算指数、图像增强等操作,以满足特定研究需求。
本文将介绍一个 Python 自动化脚本,使用 Google Earth Engine (GEE) 平台实现 Landsat 8 可见光影像校正后下载,并将结果导出到 Google Drive。
✨ 核心功能简介
这个脚本的主要功能如下:
- 自动裁剪 Landsat 8 数据 到指定地理区域;
- 遮蔽云与云影,提高影像质量;
- 计算 红、绿、蓝波段中值图像,并进行动态范围拉伸以防止过曝;
- 将处理后的 RGB 图像 导出到 Google Drive,便于进一步分析。
🔧 脚本代码实现
以下是完整的 Python 脚本实现,结合详细注释说明:
import ee# 初始化 Google Earth Engine
ee.Initialize()def crop_image_ls8(boundary, year, export_name, export_folder):"""自动裁剪 Landsat 8 图像,遮蔽云层与云影,进行动态范围拉伸并导出结果。参数说明::param boundary: 区域边界坐标,格式为 [xmin, ymin, xmax, ymax]。:param year: 中间年份,用于筛选影像时间范围。:param export_name: 导出的文件名。:param export_folder: 导出到 Google Drive 的目标文件夹。"""# 将输入边界转换为 Earth Engine 几何对象boundary = [float(coord) for coord in boundary]CoordinateMapBoundary = ee.Geometry.Rectangle(boundary)# 云和云影遮蔽函数def mask_l8_sr(image):qa_band = image.select('QA_PIXEL')cloud_shadow_bitmask = 1 << 3 # 云影遮蔽位clouds_bitmask = 1 << 4 # 云层遮蔽位mask = qa_band.bitwiseAnd(cloud_shadow_bitmask).eq(0) \.And(qa_band.bitwiseAnd(clouds_bitmask).eq(0)) # 遮蔽条件return image.updateMask(mask).divide(10000) # 归一化反射率# 获取 Landsat 8 数据集ls8_collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') \.filterBounds(CoordinateMapBoundary) \.filterDate(ee.Date.fromYMD(year - 1, 1, 1), ee.Date.fromYMD(year + 1, 12, 31)) \.map(mask_l8_sr).sort('CLOUD_COVER').limit(50)# 统计影像数量num_images = ls8_collection.size().getInfo()print(f'Landsat 8 影像数量: {num_images}')if num_images == 0:print('未找到符合条件的 Landsat 8 影像。')return None# 计算中值影像并裁剪到指定区域median_image = ls8_collection.median().clip(CoordinateMapBoundary)# 计算百分位值并应用动态范围拉伸stats = median_image.reduceRegion(reducer=ee.Reducer.percentile([2, 98]),geometry=CoordinateMapBoundary,scale=30,bestEffort=True)min_vals = stats.getInfo() # 获取每个波段的百分位值print("百分位值:", min_vals)rgb_image = median_image.select(['SR_B4', 'SR_B3', 'SR_B2']).rename(['Red', 'Green', 'Blue']) stretched_image = rgb_image.subtract([min_vals['SR_B4_p2'], min_vals['SR_B3_p2'], min_vals['SR_B2_p2']]) \.divide([min_vals['SR_B4_p98'] - min_vals['SR_B4_p2'],min_vals['SR_B3_p98'] - min_vals['SR_B3_p2'],min_vals['SR_B2_p98'] - min_vals['SR_B2_p2']]).sqrt() # 防止过曝# 导出影像到 Google Drivetask = ee.batch.Export.image.toDrive(image=stretched_image,description=export_name,folder=export_folder,fileNamePrefix=export_name,region=CoordinateMapBoundary,scale=30,maxPixels=1e13)task.start()print(f'任务已启动:导出到 Google Drive 文件夹 "{export_folder}" 下,文件名为 "{export_name}"')
📊 核心模块解读
1. 数据筛选与云层遮蔽
通过 mask_l8_sr
函数遮蔽云和云影,保证图像质量:
qa_band = image.select('QA_PIXEL')
cloud_shadow_bitmask = 1 << 3
clouds_bitmask = 1 << 4
mask = qa_band.bitwiseAnd(cloud_shadow_bitmask).eq(0) \.And(qa_band.bitwiseAnd(clouds_bitmask).eq(0))
2. 动态范围拉伸
为了避免图像过曝,计算 2% 和 98% 百分位值并拉伸图像:
stretched_image = rgb_image.subtract([min_vals['SR_B4_p2'], min_vals['SR_B3_p2'], min_vals['SR_B2_p2']]) \.divide([min_vals['SR_B4_p98'] - min_vals['SR_B4_p2'],min_vals['SR_B3_p98'] - min_vals['SR_B3_p2'],min_vals['SR_B2_p98'] - min_vals['SR_B2_p2']]).sqrt()
3. 导出结果
使用 Export.image.toDrive
将结果存储到 Google Drive:
task = ee.batch.Export.image.toDrive(image=stretched_image,description=export_name,folder=export_folder,fileNamePrefix=export_name,region=CoordinateMapBoundary,scale=30,maxPixels=1e13
)
task.start()
💡 应用场景
- 土地覆盖变化分析:提取清晰图像用于后续分类。
- 环境监测:分析多时段中值影像,跟踪环境变化。
- 定制区域研究:裁剪特定区域数据用于更精细的分析。
📋 术语与函数解释
术语/函数 | 说明 |
---|---|
Landsat 8 | 美国陆地卫星计划的第八颗卫星,提供多光谱遥感影像数据,空间分辨率为 30 米。 |
QA_PIXEL | Landsat 影像中的质量评估波段,用于标识云层、云影等像元。 |
percentile | 百分位数,表示某一百分比数据的值,比如 2% 百分位值是数据中小于该值的部分占比为 2%。 |
Export.image.toDrive | Google Earth Engine 函数,将处理后的图像导出到 Google Drive。 |
median | 计算多个影像中每个波段的中值影像,减少噪声影响。 |
如果这对您有所帮助,希望点赞支持一下作者! 😊
详细全文-点击查看