增加坡度计算

This commit is contained in:
2026-04-22 09:27:59 +08:00
parent 4fd1b0a203
commit d563a56358
20 changed files with 4891 additions and 344 deletions

197
slope/readme.txt Normal file
View File

@ -0,0 +1,197 @@
================================================================================
地形校正模块 - 已知问题与改进方向
================================================================================
【问题描述】
-----------
当前版本的 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计算