Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 167 additions & 0 deletions runtime/ops/mapper/wsi_enhance_operator/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
# WSIEnhance 全幻灯片成像处理算子

## 概述

WSIEnhance 是一个面向全幻灯片成像 (Whole Slide Imaging, WSI) 的智能化处理算子,集成了组织/笔迹/气泡/伪影检测、高质量 patch 提取、数据增强和染色归一化四大核心功能。

## 功能特性

### 1. 组织检测
- 基于 HSV 颜色空间的组织区域识别
- 自适应形态学处理,轮廓平滑完整
- 支持淡染区、脂肪区、浅粉区的精确识别
- 细脖子切断算法,避免两块组织通过浅色区连成一片

### 2. 笔迹/伪影检测
- 黑色/蓝色墨水笔迹识别
- 组织折叠检测(黑红色细长带)
- 近纯白空洞/裂隙识别
- 深紫高密度组织保护,避免误标

### 3. Patch 提取
- 基于组织 mask 映射回原图坐标
- 自动过滤白背景比例过高的 patch
- 支持 256x256 标准尺寸输出
- 精确的 patch 位置 JSON 导出

### 4. 数据增强
- 几何变换:随机旋转、翻转、弹性形变
- 颜色变换:亮度、对比度、饱和度、色调调整
- 噪声添加:高斯噪声、椒盐噪声
- 模糊变换:高斯模糊、运动模糊

### 5. 染色归一化
- Macenko 方法 - 基于 SVD 分解组织染色浓度矩阵
- Reinhard 方法 - 基于 LAB 颜色空间统计特性匹配
- Vahadane 方法 - 基于稀疏非负矩阵分解
- 支持自定义目标模板图像

## 参数说明

### 组织检测配置
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| 饱和度阈值 | slider | 8 | HSV 饱和度下限,越小越包含淡染区 |
| 亮度上限 | slider | 225 | 组织亮度上限,越大越包含浅粉区 |
| 最小组织面积 | slider | 1000 | 缩略图上保留的最小组织连通域面积(像素) |
| 闭运算核大小 | slider | 51 | 组织闭运算核大小,大核糊住脂肪、轮廓圆润 |
| 开运算核大小 | slider | 3 | 组织开运算核大小,偏小可减少碎片 |
| 细桥断开核 | slider | 9 | 断开细桥的形态学核大小 |
| 合并膨胀像素 | slider | 17 | 合并邻近组织碎块的膨胀像素数 |
| 最终平滑核 | slider | 61 | 最终平滑轮廓用闭运算核 |

### 笔迹检测配置
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| 笔迹亮度上限 | slider | 30 | 判定笔迹/黑色墨水的亮度阈值 |
| 笔迹饱和度上限 | slider | 80 | 笔迹判定时的最大饱和度 |
| 组织内笔迹亮度 | slider | 58 | 组织内仅"很暗"的像素才强制为笔迹 |
| 最小笔迹面积 | slider | 25 | 笔迹连通域最小面积(像素) |

### 伪影检测配置
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| 启用伪影检测 | switch | true | 是否启用伪影检测 |
| 颜色偏差阈值 | slider | 42.0 | LAB 与组织主色偏差阈值 |
| 最小伪影面积 | slider | 2000 | 伪影最小连通面积 |
| 空白亮度下限 | slider | 235 | 近纯白亮度下限 V |
| 空白饱和度上限 | slider | 12 | 近纯白饱和度上限 S |
| 启用折叠检测 | switch | true | 是否检测组织折叠 |
| 折叠 L 上限 | slider | 70 | LAB L 上限,越暗越可能是折叠 |
| 折叠 a 下限 | slider | 120 | LAB a 下限,排除蓝紫 |

### Patch 提取配置
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| Patch 尺寸 | slider | 256 | 提取 patch 的大小 |
| 背景灰度阈值 | slider | 210 | 灰度>该值视为背景 |
| 最大背景占比 | slider | 0.85 | 允许的背景最大占比(0~1) |
| 缩略图最大边长 | slider | 3072 | 缩略图最大边长(px) |

### 数据增强配置
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| 启用数据增强 | switch | false | 是否启用数据增强 |
| 增强倍数 | slider | 1 | 每个 patch 生成的增强版本数量 |
| 启用旋转 | switch | true | 随机旋转 (-30~30 度) |
| 启用翻转 | switch | true | 随机水平/垂直翻转 |
| 启用颜色抖动 | switch | true | 亮度/对比度/饱和度调整 |
| 启用噪声 | switch | false | 添加高斯/椒盐噪声 |
| 启用模糊 | switch | false | 高斯模糊 |
| 启用弹性形变 | switch | false | 弹性形变 |

### 染色归一化配置
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| 启用染色归一化 | switch | false | 是否启用染色归一化 |
| 归一化方法 | select | macenko | macenko/reinhard/vahadane |
| 目标模板路径 | text | - | 目标染色模板图像路径 |

## 输入输出

**输入**: WSI 图像文件路径(`image_path` 字段)

**输出**: 包含以下字段:
- `thumbnail_path`: 缩略图路径
- `thumbnail_overlay_path`: 叠加组织/笔迹/气泡轮廓的缩略图
- `patch_positions_json`: patch 位置 JSON 文件路径
- `patches_dir`: patch 输出目录
- `patch_count`: 提取的 patch 数量
- `augmented_count`: 生成的增强 patch 数量
- `wsi_size`: 原图尺寸
- `coords_thumbnail`: 组织/笔迹/伪影/气泡轮廓坐标
- `wsi_processor_metadata`: 处理元数据

## Patch 输出格式

### 原始 Patch
- 命名格式:`patch_<x>_<y>.png`
- 尺寸:256x256 像素
- 格式:RGB PNG
- 坐标系:原图 level-0 坐标系

### 增强 Patch
- 命名格式:`patch_<x>_<y>_aug<n>.png`
- 数量:由 `aug_factor` 参数控制
- 内容:随机旋转、翻转、颜色抖动等增强版本

### 位置 JSON
```json
{
"wsi_size": {"w": 100000, "h": 80000},
"patch_size": 256,
"patch_count": 1234,
"patches": [
{"x": 1024, "y": 2048},
{"x": 1280, "y": 2048}
]
}
```

## 轮廓坐标格式

`coords_thumbnail` 字段包含以下轮廓坐标(缩略图坐标系):
- `tissue_contours`: 组织轮廓
- `note_contours`: 笔迹轮廓
- `artifact_contours`: 伪影轮廓
- `bubble_contours`: 气泡轮廓

每个轮廓为点列表:`[[x1, y1], [x2, y2], ...]`

## 依赖说明

- numpy >= 1.21.0
- opencv-python-headless >= 4.5.0
- Pillow >= 8.0.0
- openslide-python >= 1.1.0
- torchstain >= 1.0.0 (染色归一化可选)
- pyvips >= 2.0.0 (巨型图像读取可选)
- wsidicom >= 0.1.0 (DICOM WSI 读取可选)

## 系统依赖
- OpenSlide 库(openslide-python 依赖)
- libvips(pyvips 依赖,可选)

## 版本历史

- **v1.0.0**: 首次发布,支持 WSI 组织检测、patch 提取、数据增强、染色归一化
11 changes: 11 additions & 0 deletions runtime/ops/mapper/wsi_enhance_operator/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
"""
WSIEnhance 全幻灯片成像处理算子注册入口
"""

from datamate.core.base_op import OPERATORS

OPERATORS.register_module(
module_name='WSIEnhanceMapper',
module_path="ops.user.wsi_enhance_operator.process"
)
Loading