基于 Flexbrdf/hytools/topo 目录下的代码，我来详细解释地形校正的原理。

地形校正原理详解
地形校正（Topographic Correction）的目的是消除地形起伏（坡度、坡向）对高光谱图像反射率的影响。由于太阳光入射角度在不同坡度和坡向上的变化，同一地物在不同地形位置会呈现不同的辐射亮度，地形校正就是要将这种差异归一化到水平地表的条件。

一、核心概念：入射角余弦（cosine i）
地形校正的核心是计算入射角余弦（cosine of incidence angle），即太阳光线与地表法线之间夹角的余弦值。

计算公式（在 topo.py:53）：

cosine_i = np.cos(solar_zn)*np.cos(slope) + np.sin(solar_zn)*np.sin(slope)*np.cos(relative_az)
其中：

solar_zn：太阳天顶角（太阳光线与垂直方向的夹角）
solar_az：太阳方位角
slope：地面坡度
aspect：地面坡向
relative_az = aspect - solar_az：相对方位角
物理意义：

当 cosine_i = 1 时，太阳光垂直照射地面（正午水平地表）
当 cosine_i < 1 时，太阳光斜射，照度降低
背阴坡 cosine_i 较小，向阳坡 cosine_i 较大
二、支持的5种地形校正方法
1. Cosine 校正（余弦校正）
原理：最简单的地形校正方法，假设地表为朗伯体（各向同性反射）。

校正公式（cosine.py:50）：

c_factor = cos_solar_zn / cos_i
cos_solar_zn：水平地表的太阳天顶角余弦
cos_i：实际地表的入射角余弦
校正效果：

corrected_reflectance = original_reflectance × (cos_solar_zn / cos_i)
特点：

简单快速
假设地表是理想朗伯体，对非朗伯体（如植被）校正过度
2. SCS 校正（Sun-Canopy-Sensor）
原理：考虑森林冠层对地形影响的简化模型，基于 "cosine i" 但增加坡度因子。

校正公式（scs.py:51）：

c_factor = (cos_slope × cos_solar_zn) / cos_i
与 Cosine 方法的区别：

增加了 cos_slope 项（坡度余弦）
考虑了坡度对观测路径的影响
适用场景：森林覆盖区域

3. C 校正（C-Correction）
原理：在 Cosine 校正基础上增加一个经验系数 C，用于调整非朗伯体效应。

校正公式（c.py:177）：

correction_factor = (cos_sz + C) / (cosine_i + C)
其中 C 系数的计算过程（c.py:42-76）：

对每个波段，建立反射率与 cosine_i 的线性关系：

ρ = slope × cos_i + intercept
通过最小二乘拟合（OLS）或非负最小二乘（NNLS）求解

计算 C 系数（Soenen et al. 2005, Eq. 8）：

C = intercept / slope
物理意义：C 值越大，表示地表越接近朗伯体，校正强度越接近 Cosine 方法；C 值越小，校正越保守。

拟合方法选择（c_fit_type）：

ols：普通最小二乘（Ordinary Least Squares）
nnls：非负最小二乘（Non-Negative Least Squares）
wls：加权最小二乘（Weighted Least Squares）
4. SCS+C 校正（推荐用于森林）
原理：结合 SCS 和 C 校正的优势，是目前森林地形校正的主流方法（Soenen et al. 2005, IEEE TGRS）。

计算步骤（scsc.py）：

计算 c1 因子：

c1 = cos(solar_zn) × cos(slope)
计算 C 系数（与 C 校正相同，通过线性回归）

综合校正因子（scsc.py:115-125）：

correction_factor = (c1 + C × cos_slope) / (cos_i + C)
为什么有效：

SCS 部分处理冠层-地形几何关系
C 部分调整非朗伯体效应
相比单独使用 SCS 或 C 校正，能更好地保持植被反射率的一致性
5. Modified Minnaert 校正（改进的 Minnaert）
原理：基于 Minnaert 指数的半经验方法，区分植被和非植被区域进行不同强度的校正（Richter et al. 2009）。

算法流程（modminn.py:46-83）：

计算调整后的太阳天顶角：

if solar_zn < 45°:    solar_zn_t = solar_zn + 20°
if 45° ≤ solar_zn ≤ 55°: solar_zn_t = solar_zn + 15°
if solar_zn > 55°:     solar_zn_t = solar_zn + 10°
NDVI 掩膜分类：

植被区（NDVI > 0.2）
非植被区（NDVI ≤ 0.2）
计算基础校正因子：

factor = cos_i / cos(solar_zn_t)
分区应用不同指数：

区域	短波（<720nm）	长波（≥720nm）
非植被
factor^(1/2)
factor^(1/2)
植被
factor^(3/4)
factor^(1/3)
限幅处理：

factor = np.clip(factor, 0.25, 1.0)
阈值控制：当入射角小于调整后的太阳天顶角时不进行校正

特点：

自适应不同地物类型
区分短波和长波有不同的散射特性
通过指数控制校正强度，避免过度校正
三、地形校正的工作流程
从 topo.py:104-154 可以看出地形校正的完整流程：

1. 设置地形参数（set_topo）
         ↓
2. 生成计算掩膜（calc_mask）
         ↓
3. 计算校正系数（calc_*_coeffs）
   - 遍历每个波段（跳过坏波段）
   - 根据选定的算法类型计算校正因子
         ↓
4. 应用校正（apply_*）
   - 支持多种数据切分方式：line/column/band/chunk/pixels
四、关键配置参数
参数	类型	说明	适用算法
type
str
校正算法类型
所有
calc_mask
list
计算校正系数的掩膜条件
所有
apply_mask
list
应用校正的掩膜条件
所有
c_fit_type
str
C系数拟合方法：ols/nnls/wls
c, scs+c
sample_perc
float
采样比例（用于分组计算）
分组计算时
五、算法选择建议
场景	推荐算法	理由
裸土/岩石
Cosine 或 C
地表接近朗伯体
森林植被
SCS+C
考虑冠层几何，校正效果最好
草地/灌木
SCS
简单有效
混合地物
Modified Minnaert
自适应不同地物
需要精确结果
C 或 SCS+C + 分组计算
按NDVI分组计算C系数
六、参考文献
SCS+C 方法：Soenen, S. A., Peddle, D. R., & Coburn, C. A. (2005). SCS+C: A Modified Sun-Canopy-Sensor Topographic Correction in Forested Terrain. IEEE TGRS, 43(9), 2148-2159.

方法比较：Richter, R., Kellenberger, T., & Kaufmann, H. (2009). Comparison of topographic correction methods. Remote Sensing, 1(3), 184-196.

C 校正：Teillet, P. M., Guindon, B., & Goodenough, D. G. (1982). On the slope-aspect correction of multispectral scanner data. Canadian Journal of Remote Sensing, 8(2), 84-106.