This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
================================================================================
地形校正模块 - 已知问题与改进方向
================================================================================
【问题描述】
-----------
当前版本的 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计算