[地图工具]SegSampling 模块说明
SegSampling 模块说明
适用版本:USDA_GeoProdStudio(Landsat2LC 项目集成) 位置:右侧工具栏 → 分割采样 主要代码:
map/seg_sampling/seg_ui_panels.py(UI)、map/seg_sampling/seg_engine.py(门面/引擎)、map/seg_sampling/seg_feature_panel.py(特征与区划页)、map/seg_sampling/engine/*.py(实现)
示例数据下载地址[20.9GB]:https://pan.baidu.com/s/1DTmbzRi0TS1IlLtqalrUTA?pwd=e2tg
目录
- 模块目标与整体流程
- 架构与关键组件
- A–E 五大页签(UI/功能全览)
- 特征构建与可视化(含公式)
- 分割算法与参数建议
- 采样(右键赋类)与自动保存机制
- 文件结构与数据模型
- 性能、稳定性与并行
- 常见问题与排错
- 版本迁移与扩展点
1) 模块目标与整体流程
SegSampling 将影像分割与人工采样标注整合在一体化工作流中,便于在同一套 UI 与地图中完成:
- A. 输入:选择影像与(可选)波段映射 JSON,做 RGB/灰度即时预览;
- B. 特征:选择输入波段与指数、归一化/直方图增强、PCA 等;
- C. 分割:选择算法、动态参数,导入/导出分割,启动/取消后台计算;
- D. 区划:基于矢量统计的区划方法(与 B 页打通);
- E. 采样:右键将分割的 polygon 赋予类别(含颜色/重命名/统计/导出/清空)。 以上各页签与状态信息区共同组成 Dock 面板。
2) 架构与关键组件
2.1 模块分层
- UI 层(
SegUiPanelsMixin):构建 A–E 页签、路由按钮事件到引擎,负责状态栏、进度条与日志落地。 - 特征/区划 UI(
SegFeaturePanelMixin):B(特征)与 D(区划)页的 UI 与参数收集骨架;计算委派给引擎侧。 - 引擎门面(
SegEngineMixin):对外兼容旧名,真实实现来自engine子包;同时暴露read_raster_info、read_rgb_array等工具,供 UI 直接调用以避免重复实现。 - A.输入实现(
a_input.py):定义RasterInfo、读栅格信息/快速 RGB 读取与拉伸(2–98% 线性拉伸)。
2.2 运行时对象与线程
- QThreadPool:后台计算(分割)与 UI 解耦,避免卡顿。
- Log & Progress:Dock 下方固定“状态信息”分区展示进度条与日志,可随时清空。
3) A–E 五大页签(UI/功能全览)
A. 输入
- 选择工作空间与影像路径;可绑定“波段映射 JSON(语义名 → 1-based 波段号)”。工作空间变化会级联影响默认导出名。
- RGB/灰度即时预览:从“可用波段”移动至 R/G/B 三列,可为每列设置逗号分隔权重;支持“单波段灰度(取 R 列首波段)”;一键显示到地图。
- 预览采用百分位拉伸到 [0,1],利于快速目视检查。
小贴士:影像预览仅用于可视校验,不改变算法实际输入。
B. 特征(管线构建)
-
输入项:
- 原始波段(含语义名)、派生指数(NDVI、NDBI、MNDWI、SAVI、EVI 等)、可选归一化/直方图增强(Z-Score / HistEq / CLAHE)、PCA(k 可设)。
-
组合规则(示例):
- 仅选原始 → 只用原始;
- 原始 7 波段 + 归一化 + PCA(k=3) → 先归一化再 PCA 得到 PC1…PCk;
- 选择指数时自动补齐所需波段依赖。
-
特征 RGB 预览:从通道名下拉(如
B4/NDVI/PC1)任取 3 个组成 RGB,显示到地图,用于在分割前检查“特征构建是否合理”。
C. 分割
- 算法选择 + 动态参数面板:算法切换将重建对应参数控件;参数规范来自 JSON(项目内置)。
- 导入/导出:可导出分割 GeoJSON,或导入既有分割以复用;
- 后台执行/取消:开始分割会进入后台线程;可随时取消;UI 有轻量防抖。
分割完成后的自动处理(摘要):
- 缓存标签(1-based);2) 栅格面多边形化写入 GeoJSON 并加载到地图;
- 建立
seg_id → 图层的 O(1) 索引用于快速着色;4) 记录最近分割图层 id。
D. 区划(Polygon)
- D 页由
SegFeaturePanelMixin构建,支持从 B 页特征/统计流程衔接;针对 GeoJSON(多边形)进行区划计算并写回属性字段(命名含“源字段 + 方法”后缀,避免覆盖)。 - 参数面板按注册 JSON 自动生成,输入/输出路径与字段命名由系统接管(UI 不再重复输入),与项目“统计项 → 区划方法”工作流一致。(详见你项目的区划注册与 d_zoning 逻辑。)
E. 采样(右键赋类)
-
类别列表支持新增/删除/重命名,并可为每类设置颜色;实时同步到地图与导出文件的
properties.name。 -
地图交互:左键高亮,右键选择类别即完成赋值;“取消采样”可撤销。
-
统计面板显示各类计数/面积等(视实现)。
-
导出 / 载入 / 清空:
- 导出当前采样为 GeoJSON;
- 载入“临时采样”(继续工作)或已保存采样;
- 一键清空临时采样(安全提示)。
自动保存机制
前端维护 SEG_ASSIGNMENTS = { seg_id: {name, color} };Python 端每 1.5 s 拉取并侦测“脏序号”变更,仅在有改动时写回 samples_live.geojson(并刷新统计)。
4) 特征构建与指数公式(B 页参考)
B 页“特征管线”支持常用指数(示例公式,设反射率为 $R_{\cdot}$):
- NDVI:$\displaystyle \frac{R_{NIR}-R_{RED}}{R_{NIR}+R_{RED}}$
- EVI:$\displaystyle 2.5\cdot\frac{R_{NIR}-R_{RED}}{R_{NIR}+6R_{RED}-7.5R_{BLUE}+1}$
- SAVI:$\displaystyle (1+L)\cdot\frac{R_{NIR}-R_{RED}}{R_{NIR}+R_{RED}+L}$(常取 $L=0.5$)
- MNDWI:$\displaystyle \frac{R_{GREEN}-R_{SWIR1}}{R_{GREEN}+R_{SWIR1}}$
- NDBI:$\displaystyle \frac{R_{SWIR1}-R_{NIR}}{R_{SWIR1}+R_{NIR}}$
选中指数后系统会自动补齐所需波段;归一化/直方图增强与 PCA 在管线中按所选顺序组合(见 3.B“组合规则”)。
PCA:从归一化后的多通道矩阵 $X\in\mathbb{R}^{H\times W\times C}$ 抽取 $k$ 个主成分,得到 $PC1…PCk$;不再强制压到 3 通道,分割器自适应输入维度(多数算法仅需将前 $k$ 个分量拼接回特征栈)。
特征 RGB 预览:任取 3 通道映射到 R/G/B 快速核验分割前的特征可分性(不影响算法真实输入)。
5) 分割算法与参数建议
5.1 支持算法(示例)
| 类别 | 算法 | 典型用途/特点 |
|---|---|---|
| scikit-image | SLIC / SLIC0、Felzenszwalb、Quickshift、Watershed | 语义超像素、图割、基于密度/梯度的方法 |
| OpenCV | SLIC / SLICO(CPU Fast) | 工程级快速超像素 |
| 聚类/漂移类 | MeanShift(sp/sr/ms_k) |
复杂纹理场景的聚类分割 |
动态参数表随算法切换自动重建(见 C 页“动态参数区”)。
5.2 入门参数(Landsat 场景)
- SLIC/SLICO(skimage):
region_size≈20–60,compactness≈10–30; - OpenCV SLIC/SLICO:
region_size≈16–32,ruler≈10–20; - Felzenszwalb:
scale≈150–400,sigma≈0–1,min_size≈40–100; - Quickshift:
kernel_size≈3–7,max_dist≈6–12,ratio≈0.5–0.8; - Watershed:
markers≈800–2000,compactness≈0.001–0.01; - MeanShift:
sp≈8–24,sr≈24–40,ms_k≈8–20。 经验:想更细,增大分割数量(减小region_size/增大markers/调整scale),并适度提高compactness平衡光谱与空间。
6) 采样(右键赋类)与自动保存
- 列表中维护类别名与颜色;双击或“🎨颜色”修改即刻同步地图着色;删除类别会清理对应着色与记录并立即保存。
- 右键赋类:在地图上对分割 polygon 右键选择目标类别,已赋值 polygon 以该类颜色填充(透明度可在图层管理器调整)。
- 自动保存节流:每 1.5 s 轮询“脏序号”变更,才写
samples_live.geojson并刷新统计(避免频繁 I/O)。
7) 文件结构与数据模型
7.1 输出文件
workspace/segments.geojson:分割面(含seg_id)。workspace/samples_live.geojson:临时采样(自动保存,建议经常保留);workspace/samples.geojson:导出采样(常与临时一致,或另存副本)。 导入既有分割/采样会直接应用到当前地图。
7.2 运行时数据结构(核心)
labels:分割结果标签(1-based)。SEG_ASSIGNMENTS:{ seg_id: { name, color } },用于 O(1) 着色查找与导出写回properties。
8) 性能、稳定性与并行
- 后台线程:分割计算放入线程池;
- 批量加载 GeoJSON:按批次切片(默认 800)加载,兼顾速度与流畅;
- 索引加速:
seg_id → layer索引支持 O(1) 右键着色; - I/O 串行与防抖:文件写入加互斥锁与按钮防抖;
- 取消清理:取消分割会主动回收大对象并恢复 UI。
9) 常见问题与排错(FAQ)
- 预览与实际分割不一致? 预览仅做目视拉伸显示,不改变算法输入;请以 B 页“特征管线”设置为准。
- 导入分割后无法右键赋类?
检查导入的 GeoJSON 是否含
seg_id字段,以及是否已建立seg_id → layer索引(导入后 UI 会自动建立)。 - 采样未保存? 自动保存依赖“脏序号”变更;若长时间未触发,请尝试微调任意着色再等 1–2 秒,或手动导出。
10) 版本迁移与扩展点
- 门面保持兼容:对外依旧使用
SegEngineMixin,真实实现迁入engine子包,便于后续替换/扩展。 - 参数规范外置:算法参数来自
segmentation_params.json;新增算法仅需注册参数与实现,并在 UI 中绑定切换回调。 - 工具可复用:
read_raster_info/read_rgb_array暴露于门面,供 UI 预览与维度校验。
附录 A:A 页 RGB/灰度预览数据流
read_rgb_array(path, bands)读取 3 通道并转float32;- 对每通道做 2–98% 线性拉伸至 [0,1];
- 结果以地图叠加层预览。
附录 B:参数页(C 页)动态构建逻辑示意
- 读取参数规范 JSON → 初始化“算法选择”与“导出路径”控件;
- 算法下拉变更 → 清空旧参数控件 → 根据
visible_when重建本算法参数; - “开始分割/取消/导入/导出”四按钮统一管理当前任务态。
附录 C:快速实践清单(Landsat 15 m 城市场景)
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | A 页选择影像 + 预览 | 先用 B5/B4/B3 或 B7/B6/B4 做自然/城市预览 |
| 2 | B 页构建特征 | 指数(NDVI/NDBI/MNDWI)+ Z-Score + PCA(k=3) |
| 3 | C 页 SLICO | region_size=24±8, ruler/compactness=15±5 |
| 4 | D 页区划 | 选择统计项与区划方法,字段自动命名 |
| 5 | E 页右键赋类 | 新增类别与颜色,随用随存,最后导出 |
若场景纹理复杂,可尝试 Quickshift 或 MeanShift,并适度调大“分割数量”。
(完)