# BRDF校正工具 - 使用说明文档

## 一、软件概述

BRDF校正工具是一款用于高光谱图像双向反射分布函数（BRDF）校正的统一GUI应用程序，支持两种场景：

1. **陆地植被BRDF校正**（FlexBRDF算法）
   - 适用于陆地植被和地表的BRDF、地形和镜面反射校正
   - 支持AVIRIS、AVIRIS-NG等机载高光谱数据

2. **水体BRDF校正**（Ocean BRDF Correction）
   - 专用于水体和海洋的BRDF校正
   - 支持多种BRDF模型和不确定性估算

---

## 二、快速开始

### 2.1 启动软件

```bash
python brdf_gui.py
```

启动后将显示主界面，选择需要使用的模块：
- 点击"进入陆地模块"打开陆地植被BRDF校正
- 点击"进入水体模块"打开水体BRDF校正

---

## 三、陆地植被BRDF校正模块（FlexBRDF）

### 3.1 界面布局

模块界面分为左右两部分：
- **左侧**：配置选项卡（文件与波段映射、校正参数、输出设置）
- **右侧**：执行日志和进度显示

### 3.2 文件与波段映射页

#### 3.2.1 文件夹设置

| 参数 | 说明 | 默认值 |
|------|------|--------|
| 输入文件夹 | 反射率文件所在目录（ENVI格式） | 空 |
| 辅助文件夹 | 观测几何数据目录 | 空 |
| CPU核心数 | 并行处理使用的CPU核心数 | 1 |

**操作步骤**：
1. 点击"浏览..."按钮选择输入文件夹和辅助文件夹
2. 点击"自动匹配文件"按钮，软件会自动匹配反射率文件（`_rfl`后缀）和观测几何文件（`_obs`后缀）
3. 匹配成功的文件对将显示在列表中

#### 3.2.2 文件匹配规则

- 反射率文件命名格式：`{prefix}_rfl{ext}`
- 观测几何文件命名格式：`{prefix}_obs{ext}`
- 软件根据`{prefix}`部分自动匹配对应文件对

#### 3.2.3 手动添加文件对

如需手动指定文件对：
1. 在"手动添加文件对"区域，分别选择反射率文件和观测几何文件
2. 点击"添加文件对"按钮

#### 3.2.4 波段映射设置

每个输入文件需要映射以下观测几何参数到辅助文件的波段：

| 参数名称 | 说明 | 默认波段 |
|----------|------|----------|
| path_length | 路径长度 | 0 |
| sensor_zn | 传感器天顶角 | 1 |
| sensor_az | 传感器方位角 | 2 |
| solar_zn | 太阳天顶角 | 3 |
| solar_az | 太阳方位角 | 4 |
| phase | 相位角 | 5 |
| slope | 坡度 | 6 |
| aspect | 坡向 | 7 |
| cosine_i | 入射角余弦 | 8 |

**设置方法**：
1. 在文件列表中选择一个文件
2. 在右侧波段映射表格中设置各参数对应的波段索引（从0开始）
3. 点击"应用当前映射"保存设置

### 3.3 校正参数页

#### 3.3.1 选择校正类型

勾选需要执行的校正类型（可单选或多选）：

| 校正类型 | 说明 |
|----------|------|
| Topo (地形校正) | 消除地形起伏对反射率的影响 |
| BRDF (双向反射分布函数) | 校正各向异性反射效应 |
| Glint (耀斑校正) | 消除水体或湿润表面的镜面反射 |

#### 3.3.2 地形校正参数（Topo Correction）

| 参数 | 选项 | 默认值 | 说明 |
|------|------|--------|------|
| 类型 (type) | mod_minneart, scs+c, cosine, c, scs | mod_minneart | 地形校正算法类型 |
| 拟合类型 (c_fit_type) | nnls, ols, wls | nnls | 系数拟合方法 |

**掩膜条件设置**：
- **计算掩膜 (calc_mask)**：定义参与计算校正因子的像素条件
- **应用掩膜 (apply_mask)**：定义应用校正的像素条件

掩膜条件类型详见[第5章 掩膜条件说明](#五掩膜条件说明)。

#### 3.3.3 BRDF校正参数（BRDF Correction）

| 参数 | 选项/范围 | 默认值 | 说明 |
|------|-----------|--------|------|
| 算法类型 (type) | flex, universal | flex | BRDF算法类型 |
| 启用分组 (grouped) | 勾选/取消 | 勾选 | 是否按NDVI分组计算 |
| 几何核 (geometric) | li_sparse, li_dense, li_sparse_r, li_dense_r, roujean | li_sparse | 几何光学核函数 |
| 体积核 (volume) | ross_thin, ross_thick, hotspot, roujean | ross_thick | 体积散射核函数 |
| b/r 比率 | 0.1 - 10.0 | 2.5 | 树冠宽度/高度比 |
| h/b 比率 | 0.1 - 5.0 | 2.0 | 树高/树冠宽度比 |
| 采样比例 (sample_perc) | 0.01 - 1.0 | 0.1 | 用于拟合的采样比例 |
| 插值方法 (interp_kind) | linear, nearest, cubic | linear | 插值方法 |
| 分箱类型 (bin_type) | dynamic, fixed | dynamic | NDVI分箱类型 |
| 分箱数量 (num_bins) | 1 - 100 | 18 | NDVI分箱数量 |
| NDVI最小值 (ndvi_bin_min) | 0.0 - 1.0 | 0.05 | 分箱NDVI下限 |
| NDVI最大值 (ndvi_bin_max) | 0.0 - 1.0 | 1.0 | 分箱NDVI上限 |
| NDVI百分比最小值 (ndvi_perc_min) | 0 - 100 | 10 | 有效样本百分比下限 |
| NDVI百分比最大值 (ndvi_perc_max) | 0 - 100 | 95 | 有效样本百分比上限 |
| 太阳天顶角类型 (solar_zn_type) | scene, fixed, mean, custom | scene | 太阳天顶角计算方法 |

**核函数组合推荐**：
- 植被覆盖区：`li_sparse` + `ross_thick`
- 稀疏植被区：`roujean` + `roujean`
- 浓密植被区：`li_dense` + `ross_thick`

#### 3.3.4 耀斑校正参数（Glint Correction）

| 参数 | 选项 | 默认值 | 说明 |
|------|------|--------|------|
| 类型 (type) | mod_minneart, scs+c, cosine, c, scs, nir, mask | nir | 耀斑校正方法 |
| 拟合类型 (c_fit_type) | nnls, ols, wls | nnls | 系数拟合方法 |

**掩膜条件设置**：
- **计算掩膜 (calc_mask)**：定义参与计算耀斑因子的像素
- **应用掩膜 (apply_mask)**：定义应用耀斑校正的像素

### 3.4 输出设置页

| 参数 | 说明 | 默认值 |
|------|------|--------|
| 输出目录 | 校正结果保存路径 | 空 |
| 后缀 (Suffix) | 输出文件名后缀 | topo_brdf_glint |
| 输出系数 (coeffs) | 输出校正系数文件 | 不勾选 |
| 输出图像 (image) | 输出校正后图像 | 勾选 |
| 输出掩膜 (masks) | 输出使用的掩膜 | 不勾选 |

**输出文件名格式**：
```
{原文件名}_{后缀}.dat
```

### 3.5 操作按钮

| 按钮 | 功能 |
|------|------|
| 加载 JSON 配置 | 从JSON文件加载之前保存的配置 |
| 保存 JSON 配置 | 将当前配置保存为JSON文件 |
| 生成配置并运行 | 生成配置并启动BRDF校正处理 |

---

## 四、水体BRDF校正模块（Ocean BRDF）

### 4.1 输入文件设置

| 参数 | 文件格式 | 说明 |
|------|----------|------|
| 高光谱文件 | ENVI (.dat, .bsq, .bip, .bil, .hdr) | 高光谱遥感影像 |
| 角度文件 | ENVI (.dat, .bsq, .bip, .bil, .hdr) | 观测几何角度数据 |
| 水体掩膜 | GeoTIFF (.tif, .tiff) | 水体区域掩膜 |

### 4.2 BRDF模型参数

| 参数 | 选项 | 默认值 | 说明 |
|------|------|--------|------|
| BRDF模型 | L11, M02, M02SeaDAS, O25 | L11 | BRDF校正模型 |
| 处理块大小 | 1024 - 16384 | 4096 | 光谱维分块大小 |
| 空间块大小 | 256 - 2048 | 512 | 空间维分块大小 |
| 计算不确定性 | 勾选/取消 | 取消 | 是否计算BRDF不确定度 |

**BRDF模型说明**：
- **L11**：Lee et al. (2011) 模型，适用于开阔大洋
- **M02**：Morel et al. (2002) 模型，经典水体BRDF模型
- **M02SeaDAS**：SeaDAS实现的M02模型
- **O25**：最新优化模型

### 4.3 输出变量选择

支持多选（按住Ctrl键选择多个）：

| 变量 | 说明 |
|------|------|
| Rw_brdf | BRDF校正后的水体反射率 |
| rho_ex_w | 水体反射率 (nrrs * π) |
| nrrs | 归一化遥感反射率 |
| C_brdf | BRDF校正因子 |
| brdf_unc | BRDF不确定度（需勾选计算不确定性） |
| nrrs_unc | nrrs不确定度（需勾选计算不确定性） |

**默认选中**：Rw_brdf, nrrs, C_brdf

### 4.4 输出设置

| 参数 | 选项 | 默认值 |
|------|------|--------|
| 输出路径 | 文件前缀路径 | 空 |
| 输出格式 | ENVI | ENVI |

### 4.5 运行

点击"运行水体BRDF校正"按钮开始处理。

---

## 五、掩膜条件说明

掩膜用于定义参与计算或应用校正的像素范围。所有掩膜条件取交集（同时满足）。

### 5.1 支持的掩膜类型

| 类型 | 说明 | 参数 |
|------|------|------|
| **ndi** | 归一化差值指数 | band_1, band_2, min, max |
| **ancillary** | 辅助数据掩膜 | name, min, max |
| **neon_edge** | NEON数据边缘掩膜 | radius |
| **kernel_finite** | 核函数有限性掩膜 | 无参数 |
| **water** | 水体掩膜 | band_1, band_2, threshold |
| **external** | 外部掩膜文件 | file_path, class |
| **band** | 单波段阈值 | band, min, max |

### 5.2 各类型详细参数

#### ndi（归一化差值指数）

```
ndi = (band_1 - band_2) / (band_1 + band_2)
保留范围: [min, max] 内的像素
```

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| band_1 | 整数 | 550 | 第一个波段波长(nm) |
| band_2 | 整数 | 2150 | 第二个波段波长(nm) |
| min | 浮点数 | -1.0 | NDI最小值 |
| max | 浮点数 | 0.0 | NDI最大值 |

**典型应用**：
- NDVI植被掩膜：band_1=850, band_2=680, min=0.2, max=1.0
- NDWI水体掩膜：band_1=860, band_2=1240, min=-1.0, max=0.0

#### ancillary（辅助数据掩膜）

基于观测几何参数创建掩膜。

| 参数 | 类型 | 默认值 | 可选值 |
|------|------|--------|--------|
| name | 字符串 | slope | slope, aspect, cosine_i, sensor_zn, sensor_az, solar_zn, solar_az, phase, path_length, utc_time |
| min | 浮点数 | 0.0 | - |
| max | 浮点数 | 1.0 | - |

**典型应用**：
- 坡度掩膜：只处理坡度小于30度的区域
  - name=slope, min=0, max=30
- 太阳天顶角掩膜：排除大太阳天顶角
  - name=solar_zn, min=0, max=60

#### neon_edge（NEON边缘掩膜）

用于消除NEON高光谱数据图像边缘的噪声区域。

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| radius | 整数 | 1 | 边缘裁剪像素数 |

#### kernel_finite（核函数有限性掩膜）

自动排除会导致核函数计算溢出或不稳定的像素。无需参数。

#### water（水体掩膜）

使用特定波段组合识别水体。

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| band_1 | 整数 | 550 | 第一个波段波长(nm) |
| band_2 | 整数 | 850 | 第二个波段波长(nm) |
| threshold | 浮点数 | 0.0 | 水体识别阈值 |

#### external（外部掩膜文件）

使用外部分类或掩膜文件。

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| file_path | 字符串 | 空 | 外部掩膜文件路径 |
| class | 整数 | 1 | 要保留的类别值 |

#### band（单波段阈值）

基于单个波段的值创建掩膜。

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| band | 整数 | 650 | 波段波长(nm) |
| min | 浮点数 | 0.0 | 最小值 |
| max | 浮点数 | 1.0 | 最大值 |

### 5.3 掩膜条件设置步骤

1. 在校正参数页找到掩膜设置区域
2. 点击"+ 添加条件"按钮
3. 选择掩膜类型
4. 设置对应参数值
5. 可添加多个条件（取交集）
6. 点击"删除"按钮移除不需要的条件

---

## 六、配置文件的保存与加载

### 6.1 保存配置

1. 完成所有参数设置
2. 点击"保存 JSON 配置"按钮
3. 选择保存路径和文件名
4. 配置将以JSON格式保存，包含：
   - 输入文件列表
   - 波段映射关系
   - 校正参数设置
   - 掩膜条件
   - 输出设置

### 6.2 加载配置

1. 点击"加载 JSON 配置"按钮
2. 选择之前保存的JSON配置文件
3. 软件将自动恢复所有设置

**注意**：
- 加载配置后会自动匹配文件对，请确保输入文件和辅助文件路径仍然有效
- 如果文件路径已改变，需要重新手动设置文件夹路径

---

## 七、典型工作流程

### 7.1 陆地植被BRDF校正流程

1. **启动软件** → 选择"陆地植被BRDF校正"
2. **设置文件夹** → 选择输入文件夹和辅助文件夹
3. **匹配文件** → 点击"自动匹配文件"
4. **检查映射** → 确认波段映射设置正确
5. **选择校正** → 勾选需要的校正类型（Topo/BRDF/Glint）
6. **设置参数** → 根据数据特点调整校正参数
7. **设置掩膜** → 添加合适的掩膜条件（如NDVI>0.2）
8. **设置输出** → 指定输出目录和后缀
9. **保存配置** → （可选）保存当前配置
10. **运行** → 点击"生成配置并运行"

### 7.2 水体BRDF校正流程

1. **启动软件** → 选择"水体BRDF校正"
2. **选择文件** → 依次选择高光谱文件、角度文件、水体掩膜
3. **选择模型** → 选择适合的BRDF模型（通常用L11）
4. **选择变量** → 勾选需要的输出变量
5. **调整参数** → （可选）调整块大小以优化性能
6. **设置输出** → 指定输出文件前缀路径
7. **运行** → 点击"运行水体BRDF校正"

---

## 八、常见问题与解决方案

### 8.1 文件匹配问题

**问题**：自动匹配找不到文件对

**解决**：
- 检查文件命名是否符合 `{prefix}_rfl` 和 `{prefix}_obs` 格式
- 确保输入文件夹和辅助文件夹路径正确
- 使用手动添加功能指定文件对

### 8.2 波段映射问题

**问题**：提示波段索引超出范围

**解决**：
- 检查辅助文件的实际波段数
- 确认波段索引从0开始计数
- 验证辅助文件格式正确

### 8.3 内存不足问题

**问题**：处理大文件时内存溢出

**解决**：
- 减少CPU核心数设置
- 对于水体模块，减小处理块大小（chunk_size）
- 分块处理（FlexBRDF会自动分块）

### 8.4 掩膜问题

**问题**：校正后结果为空或过少

**解决**：
- 检查掩膜条件是否过于严格
- 验证NDVI或波段阈值设置是否合理
- 查看掩膜类型是否与数据匹配

---

## 九、技术参数参考

### 9.1 支持的文件格式

| 类型 | 格式 |
|------|------|
| 输入反射率 | ENVI标准格式 (.dat + .hdr) |
| 观测几何 | ENVI标准格式 (.dat + .hdr) |
| 水体掩膜 | GeoTIFF (.tif) |
| 输出结果 | ENVI标准格式 |
| 配置文件 | JSON (.json) |

### 9.2 系统要求

- **操作系统**：Windows 10/11, Linux, macOS
- **Python版本**：3.8+
- **内存**：建议8GB以上（处理大图像需要更多）
- **依赖库**：PyQt5, numpy, scipy等（详见requirements.txt）

---

## 十、联系与支持

如有问题或建议，请查看项目文档或联系开发团队。

---

*文档版本：v1.0*
*最后更新：2026年4月*
