================================================================================ 地形校正模块 - 已知问题与改进方向 ================================================================================ 【问题描述】 ----------- 当前版本的 slope_aspectV2.py 在处理推扫式无人机高光谱图像时,存在一个关键假设: 整幅图像使用单一的太阳天顶角和方位角来计算 cosine_i(入射角余弦)。 然而,实际数据采集情况是: - 高光谱图像由3个架次的无人机飞行拼接而成 - 每个架次的飞行时间不同(通常间隔数分钟至数十分钟) - 因此,不同扫描线(或不同图像区域)对应的太阳角度是不同的 - 但目前代码仅基于DEM中心点坐标计算一组太阳角度,并应用于整幅图像 【技术影响】 ----------- 这个简化会导致以下问题: 1. 时间跨度误差 - 假设3个架次间隔30分钟,太阳方位角可能变化7-8度(取决于纬度) - 在日出/日落时段,太阳高度角变化可达10-15度 - 这会导致不同架次交界处的 cosine_i 出现系统性偏差 2. 地形校正不准确 - 东向坡面:过早架次会低估照明,过晚架次会高估照明 - 西向坡面:与东向坡面相反 - 交界区域会出现明显的"拼接缝"现象 3. BRDF校正累积误差 - cosine_i 是许多BRDF模型的关键输入参数 - 角度误差会传播到后续的BRDF地形校正结果 【当前代码实现】 --------------- 文件: slope/slope_aspectV2.py 当前流程: 1. 读取DEM -> 2. 计算坡度/坡向 -> 3. 获取DEM中心点坐标(lat, lon) 4. 根据单一时间计算一组太阳角度(solar_zn, solar_az) 5. 将这组角度应用于整幅图像的所有像素 关键代码段(约110-130行): ```python # 获取DEM中心点坐标 latitude, longitude = get_dem_center_coords(dem) # 仅一个中心点! # 计算太阳角度(仅一组) solar_zn_deg, solar_az_deg = calc_solar_angles(latitude, longitude, observation_time) # 应用于整幅图像 cosine_i = calc_cosine_i(solar_zn_rad, solar_az_rad, aspect_rad, slope_rad) ``` 【需要的改进方向】 ----------------- 接手人员需要进行以下修改: 方案A: 分架次处理(推荐) ---------------------------- 如果已知3个架次的地理分界线或时间范围: 1. 输入格式修改 - 接收3组时间参数(或从飞行日志自动提取) - 例如: -t1 "2024-06-15 08:30:00" -t2 "2024-06-15 09:00:00" -t3 "2024-06-15 09:30:00" 2. 空间分区处理 - 根据每架次的覆盖范围(可从高光谱图像的GLT或地理坐标确定) - 将DEM分割为3个区域 - 每个区域使用对应架次的时间计算太阳角度 3. 修改后的伪代码示例: ```python # 定义3个架次的时间和地理范围 flight_segments = [ {'time': '2024-06-15 08:30:00', 'row_range': (0, 1200)}, # 架次1: 行0-1199 {'time': '2024-06-15 09:00:00', 'row_range': (1200, 2800)}, # 架次2: 行1200-2799 {'time': '2024-06-15 09:30:00', 'row_range': (2800, 4000)}, # 架次3: 行2800-3999 ] # 初始化cosine_i数组 cosine_i = np.zeros_like(slope_data) # 分段计算 for segment in flight_segments: dt = parse_datetime(segment['time']) solar_zn, solar_az = calc_solar_angles(lat, lon, dt) y1, y2 = segment['row_range'] cosine_i[y1:y2, :] = calc_cosine_i( np.deg2rad(solar_zn), np.deg2rad(solar_az), aspect_rad[y1:y2, :], slope_rad[y1:y2, :] ) ``` 方案B: 逐行/逐像素太阳角度(更精确) ------------------------------------- 如果需要更高精度(考虑太阳角度在单架次内的缓慢变化): 1. 输入要求 - 高光谱图像的每一行对应的时间戳(可从IMU/GPS数据提取) - 或者:每个像素的精确UTC时间 2. 逐行计算 ```python # 假设times是一个与图像行数相同长度的一维数组 # times[i] = 第i行的观测时间(datetime对象) for row in range(n_rows): dt = observation_times[row] # 该行的具体时间 solar_zn, solar_az = calc_solar_angles(lat, lon, dt) cosine_i[row, :] = calc_cosine_i( np.deg2rad(solar_zn), np.deg2rad(solar_az), aspect_rad[row, :], slope_rad[row, :] ) ``` 3. 性能优化 - 由于pvlib计算较慢,可对时间相近的行批量计算 - 例如:每10行计算一次太阳角度,中间行插值 方案C: 从飞行日志自动提取(最自动化) -------------------------------------- 如果飞行平台记录了GPS/IMU数据: 1. 输入数据 - 读取POS数据(位置、姿态、时间) - 或从高光谱图像的GLT(地理位置查找表)提取 2. 建立时间-位置映射 - 根据无人机位置和时间建立每行图像的观测时间 3. 分区域计算cosine_i 【数据结构参考】 --------------- 典型的推扫式高光谱数据结构: 高光谱图像 (lines, samples, bands) - lines: 扫描线数(飞行方向的像素数) - samples: 每行的像素数(垂直飞行方向) - 第i行对应无人机的第i个位置 关键信息来源: 1. 图像头文件 (.hdr) - 通常包含起始时间和积分时间 2. GLT文件 (Geographic Lookup Table) - 每个像素的地理坐标 3. 飞行日志/POS数据 - 每行对应的时间戳 4. 帧辅助数据 (Frame Auxiliary Data) - 部分传感器自带每帧时间 【建议的输入接口修改】 ---------------------- 当前命令行接口: python slope_aspectV2.py -i dem.tif -o output.dat -t "2024-06-15 10:00:00" 建议扩展为: # 方式1: 手动指定3个架次的时间和行范围 python slope_aspectV2.py -i dem.tif -o output.dat \ --segments "0,1200,2024-06-15T08:30:00" \ --segments "1200,2800,2024-06-15T09:00:00" \ --segments "2800,4000,2024-06-15T09:30:00" # 方式2: 从飞行日志文件自动读取 python slope_aspectV2.py -i dem.tif -o output.dat --time-log flight_log.csv # 方式3: 从高光谱图像头文件提取时间信息 python slope_aspectV2.py -i dem.tif -o output.dat --hyperspectral-ref image.hdr 【验证方法】 ----------- 修改后应验证以下指标: 1. 连续性检查 - 目视检查3个架次交界处的cosine_i是否连续 - 统计交界行前后10行的cosine_i差异 2. 物理合理性 - 东向坡的cosine_i应随时间增加而增加(上午飞行) - 西向坡的cosine_i应随时间增加而减小(上午飞行) 3. 与GLT对比 - 如果高光谱有GLT,可根据每像素的太阳角度公式验证 【相关文件】 ----------- - slope_aspectV2.py - 当前主程序(需要修改) - angle_compute.py - 角度计算工具(可能包含相关逻辑) - 高光谱图像的.hdr文件 - 可能包含时间元数据 - 飞行日志/POS数据 - 外部时间参考 【优先级建议】 -------------- 1. 【高】首先实现方案A(分架次处理)- 工作量适中,效果显著 2. 【中】评估是否需要方案B(逐行)- 取决于太阳角度变化幅度 3. 【低】长期可考虑方案C(全自动)- 需要整合飞行数据解析 简单来说在计算的时候,需要加入角度文件,进行逐像素的cosi计算