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


目录

  1. 模块目标与整体流程
  2. 架构与关键组件
  3. A–E 五大页签(UI/功能全览)
  4. 特征构建与可视化(含公式)
  5. 分割算法与参数建议
  6. 采样(右键赋类)与自动保存机制
  7. 文件结构与数据模型
  8. 性能、稳定性与并行
  9. 常见问题与排错
  10. 版本迁移与扩展点

1) 模块目标与整体流程

SegSampling 将影像分割人工采样标注整合在一体化工作流中,便于在同一套 UI 与地图中完成:

  • A. 输入:选择影像与(可选)波段映射 JSON,做 RGB/灰度即时预览;
  • B. 特征:选择输入波段与指数、归一化/直方图增强、PCA 等;
  • C. 分割:选择算法、动态参数,导入/导出分割,启动/取消后台计算;
  • D. 区划:基于矢量统计的区划方法(与 B 页打通);
  • E. 采样:右键将分割的 polygon 赋予类别(含颜色/重命名/统计/导出/清空)。 以上各页签与状态信息区共同组成 Dock 面板。

2) 架构与关键组件

2.1 模块分层

  • UI 层SegUiPanelsMixin):构建 A–E 页签、路由按钮事件到引擎,负责状态栏、进度条与日志落地。
  • 特征/区划 UISegFeaturePanelMixin):B(特征)与 D(区划)页的 UI 与参数收集骨架;计算委派给引擎侧。
  • 引擎门面SegEngineMixin):对外兼容旧名,真实实现来自 engine 子包;同时暴露 read_raster_inforead_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],利于快速目视检查。

小贴士:影像预览仅用于可视校验,不改变算法实际输入。

USDA-GeoProdStudio


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,显示到地图,用于在分割前检查“特征构建是否合理”。

USDA-GeoProdStudio

USDA-GeoProdStudio


C. 分割

  • 算法选择 + 动态参数面板:算法切换将重建对应参数控件;参数规范来自 JSON(项目内置)。
  • 导入/导出:可导出分割 GeoJSON,或导入既有分割以复用;
  • 后台执行/取消:开始分割会进入后台线程;可随时取消;UI 有轻量防抖。

分割完成后的自动处理(摘要):

  1. 缓存标签(1-based);2) 栅格面多边形化写入 GeoJSON 并加载到地图;
  2. 建立 seg_id → 图层 的 O(1) 索引用于快速着色;4) 记录最近分割图层 id。

USDA-GeoProdStudio

USDA-GeoProdStudio


D. 区划(Polygon)

  • D 页由 SegFeaturePanelMixin 构建,支持从 B 页特征/统计流程衔接;针对 GeoJSON(多边形)进行区划计算并写回属性字段(命名含“源字段 + 方法”后缀,避免覆盖)。
  • 参数面板按注册 JSON 自动生成,输入/输出路径与字段命名由系统接管(UI 不再重复输入),与项目“统计项 → 区划方法”工作流一致。(详见你项目的区划注册与 d_zoning 逻辑。)

USDA-GeoProdStudio

USDA-GeoProdStudio

USDA-GeoProdStudio


E. 采样(右键赋类)

  • 类别列表支持新增/删除/重命名,并可为每类设置颜色;实时同步到地图与导出文件的 properties.name

  • 地图交互:左键高亮,右键选择类别即完成赋值;“取消采样”可撤销。

  • 统计面板显示各类计数/面积等(视实现)。

  • 导出 / 载入 / 清空

    • 导出当前采样为 GeoJSON;
    • 载入“临时采样”(继续工作)或已保存采样;
    • 一键清空临时采样(安全提示)。

自动保存机制 前端维护 SEG_ASSIGNMENTS = { seg_id: {name, color} };Python 端每 1.5 s 拉取并侦测“脏序号”变更,仅在有改动时写回 samples_live.geojson(并刷新统计)。

USDA-GeoProdStudio


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–60compactness≈10–30
  • OpenCV SLIC/SLICOregion_size≈16–32ruler≈10–20
  • Felzenszwalbscale≈150–400sigma≈0–1min_size≈40–100
  • Quickshiftkernel_size≈3–7max_dist≈6–12ratio≈0.5–0.8
  • Watershedmarkers≈800–2000compactness≈0.001–0.01
  • MeanShiftsp≈8–24sr≈24–40ms_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)

  1. 预览与实际分割不一致? 预览仅做目视拉伸显示,不改变算法输入;请以 B 页“特征管线”设置为准。
  2. 导入分割后无法右键赋类? 检查导入的 GeoJSON 是否含 seg_id 字段,以及是否已建立 seg_id → layer 索引(导入后 UI 会自动建立)。
  3. 采样未保存? 自动保存依赖“脏序号”变更;若长时间未触发,请尝试微调任意着色再等 1–2 秒,或手动导出。

10) 版本迁移与扩展点

  • 门面保持兼容:对外依旧使用 SegEngineMixin,真实实现迁入 engine 子包,便于后续替换/扩展。
  • 参数规范外置:算法参数来自 segmentation_params.json;新增算法仅需注册参数与实现,并在 UI 中绑定切换回调。
  • 工具可复用read_raster_info/read_rgb_array 暴露于门面,供 UI 预览与维度校验。

附录 A:A 页 RGB/灰度预览数据流

  1. read_rgb_array(path, bands) 读取 3 通道并转 float32
  2. 对每通道做 2–98% 线性拉伸至 [0,1];
  3. 结果以地图叠加层预览。

附录 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,并适度调大“分割数量”。


(完)