# 📋 需求整理 ## 矩形区域灰度测量功能详述 **功能描述**:用户可以在医学图像上绘制矩形选区,系统自动计算该选区内的平均灰度值并显示测量结果。 **需求要点**: - 支持绘制矩形区域选择器 - 计算矩形区域内所有像素的灰度平均值 - 显示测量结果(数值和单位) - 支持测量历史记录和清除功能 - 与现有测量工具集成 ## 🏗️ 参与者分析 ### 粗粒度参与者 | 参与者 | 职责描述 | 交互方式 | |--------|----------|----------| | `RectangleGrayscaleMeasurementTool` | 矩形区域灰度测量工具主类 | 实现测量逻辑 | | `MeasurementToolManager` | 测量工具管理器 | 统一管理所有测量工具 | | `StackImageViewer` | 图片查看器组件 | UI界面和工具注册 | | `ViewerContainer` | 查看器容器 | 事件分发和状态管理 | | `MeasurementPanel` | 测量控制面板 | UI控制器 | ### 中等粒度参与者 **RectangleGrayscaleMeasurementTool类分析**: - 数据结构:继承自BaseTool,提供几何计算和灰度统计 - 方法层级:创建默认标注 → 事件处理 → 数据计算 → 结果展示 - 依赖项:Cornerstone3D Annotations系统 **MeasurementToolManager方法分析**: - 状态控制:工具激活/停用/切换 - 批量操作:多视口管理 - 数据清理:标注移除 ### 细粒度参与者 **核心方法链**: ``` MeasurementPanel.onClick() → ViewerContainer.handleMeasurementAction() → MeasurementToolManager.activateRectangleGrayscaleMeasurementTool() → StackImageViewer.registerTools() → RectangleGrayscaleMeasurementTool.constructor() ``` **数据流向**: ``` mouseDown → geometry creation → AnnotationManager.addAnnotation() → cachedStats calculation → render statistics overlay ``` ## 🔄 交互流程 ### 泳道图:矩形区域灰度测量过程 ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ Measurement │ │ ViewerContainer │ │ MeasurementTool │ │ Panel │ │ │ │ Manager │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ │ │ │ 用户点击"矩形区域灰度" │ │ │───────────────────────▶ │ │ │ │ │ │ dispatch测量action │ │ │──────────────────────▶ │ │ │ │ │ activateTool() │ │ │──────────────────────▶ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ Cornerstone3D │ │ StackImageViewer │ │ RectangleTool │ │ Tools │ │ │ │ │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ │ │ │ │ │ │ tool registered │ │ │◀────────────────────── │ │ │ │ │ mouseDown │ │ ◀────────────────────── │ │ │ │ │ │ create default │ │ │ annotation │ │ ◀──────────────────────│ │ │ │ │ calculate │ ◀─────────────────────── │ │ │ │ │ render stats │ ◀─────────────────────── │ ``` ## 🌊 数据流分析 ### 1. 初始化数据流 ``` 测量面板初始化 → MEASUREMENT_TOOL_CONFIGS映射 → CurrsorResetListener注册 → Tool注册 ``` ### 2. 用户操作数据流 ``` 用户点击 → Redux Action分发 → measurementAction更新 → useEffect触发 → MEASUREMENT_TOOL_CONFIGS查找 → 配置对象提取 → activateMeasurementTool调用 → MeasurementToolManager方法执行 → StackImageViewer函数调用 ``` ### 3. 工具启用数据流 ``` ToolGroup增加工具 → 工具设置为active模式 → _modify激活 → AnnotationManager添加默认标注 → EnabledElement获取 → _updateCachedStats更新统计数据 → 界面更新 ``` ### 4. 统计计算数据流 ``` Canvas获取 → imageData提取 → pixelData数组处理 → 统计计算(Max/Min/Avg/StdDev) → cachedStats更新 → 界面更新 ``` ## 🏢 数据结构 ### 矩形区域灰度测量数据结构 #### RectangleAnnotationData ```typescript interface RectangleAnnotationData { // 几何数据 handles: { points: Point3[]; // 4个顶点坐标 activeHandleIndex: number; }; // 统计数据 cachedStats: { modality: string; // 成像模态 area: number; // 面积(单位:mm²) mean: number; // 平均灰度值 (HU) stdDev: number; // 标准差 min: number; // 最小值 max: number; // 最大值 units: string; // 单位 }; } ``` #### MeasurementToolConfig ```typescript interface MeasurementToolConfig { toolName: string; // 工具类名 activateFunction: Function; // 激活函数 logPrefix: string; // 日志前缀 } ``` #### CalculationParameters ```typescript interface CalculationParameters { imageData: cornerstone.Types.IImageData; // 图像数据 rectanglePoints: Point3[]; // 矩形顶点 pixelSpacing: number[]; // 像素间距 [x,y] modality: string; // 成像模态 } ``` ## 🎯 执行流程 ### 矩形区域灰度测量完整执行流程 **起点**: 用户在测量面板点击"矩形区域灰度"按钮 **主要步骤**: 1. **事件触发** → MeasurementPanel 按钮点击 2. **Action分发** → Redux更新measurementAction状态 3. **处理响应** → ViewerContainer useEffect监听状态变化 4. **工具激活** → MeasurementToolManager激活对应工具 5. **交互开始** → Cornerstone Tools处理鼠标事件 6. **标注创建** → Annotation Manager创建新的观察标注 7. **统计计算** → 计算选区内部素灰度统计信息 8. **结果显示** → 渲染测量结果覆盖层 ### 详细子流程 #### 激活工具子流程 ``` 选择viewport → 检查toolGroup → 添加RectangleGrayscaleMeasurementTool → 设置工具为active模式 → 激活修改功能 → 创建默认标注 → 更新缓存统计 → 触发渲染 ``` #### 数据计算子流程 ``` 获取图像数据 → 提取pixelData → 遍历矩形区域 → 累加像素值 → 计算Max/Min/Sum/Count → 计算Average和StdDev → 格式化结果 ``` ## 🧪 测试方案 ### 功能测试场景 | 测试场景 | 测试步骤 | 预期结果 | |----------|----------|----------| | 正常使用场景 | 1. 点击"矩形区域灰度"按钮
2. 在图像上绘制矩形
3. 完成绘制 | 显示平均灰度值和统计信息 | | CT图像测试 | 使用CT图像测试 | 显示HU值为负数,单位为HU | | 多选区测试 | 在同一图像创建多个矩形 | 每个矩形独立显示统计信息 | | 工具切换测试 | 使用后切换到其他测量工具 | 矩形标注保留,可以重新编辑 | | 清除功能测试 | 使用"清除测量"功能 | 所有矩形标注消失 | ### 边界情况测试 | 边界情况 | 测试方法 | 预期结果 | |----------|----------|----------| | 空选区 | 绘制大小为0的矩形 | 显示警告或忽略操作 | | 图像边界 | 绘制超出图像边界的矩形 | 自动裁剪到图像边界 | | 小选区 | 选择1x1像素的矩形 | 显示单像素灰度值 | | 大选区 | 选择覆盖整个图像的矩形 | 显示全局平均灰度值 | ### 人工测试操作步骤 1. **启动应用程序** ```bash npm run h5:browser # 或其他启动命令 ``` 2. **导航到测量面板** - 在主界面找到测量面板入口 - 点击"图像测量"打开测量面板 3. **激活矩形区域灰度工具** - 在测量面板中找到"矩形区域灰度"按钮 - 点击按钮激活测量工具 4. **执行测量** - 将鼠标移到图像上,鼠标指针变为测量工具样式 - 按下鼠标左键,开始绘制矩形 - 拖拽鼠标定义矩形区域 - 松开鼠标左键完成绘制 5. **查看测量结果** - 观察矩形选区显示统计信息 - 检查是否显示平均灰度值、面积等 6. **测试工具切换** - 激活其他测量工具,确认矩形标注保留 - 重新选择矩形工具,点击标注进行编辑 7. **测试清除功能** - 在测量面板点击"清除测量" - 确认所有标注被移除 ## 🐛 潜在问题检查 ### 边界问题 - **内存管理**: 大图像大量标注可能造成内存压力 - **性能问题**: 实时计算大面积矩形的统计值可能较慢 - **多帧图像**: 需要考虑不同帧间的标注同步 ### 异常处理 - **图像数据加载失败**: 应有错误提示而不是崩溃 - **网络请求超时**: 测量结果更新延迟的友好处理 - **不支持的图像格式**: 格式不支持时的降级提示 ### 兼容性问题 - **不同DICOM模态**: CT和普通X-ray的灰度值处理差异 ## 🔧 实现总结 ### 核心文件修改 1. **新建文件**: - `src/components/measures/RectangleGrayscaleMeasurementTool.ts` - 矩形灰度测量工具类 2. **修改文件**: - `src/pages/view/components/viewers/stack.image.viewer.tsx` - 添加工具注册和导出函数 - `src/utils/measurementToolManager.ts` - 添加工具管理方法 - `src/pages/view/components/ViewerContainer.tsx` - 添加激活函数导入 ### 解决的bug 1. **static方法中的this问题**: 将所有`this.getToolGroup(viewportId)`替换为`MeasurementToolManager.getToolGroup(viewportId)` ### 技术实现要点 1. **Cornerstone3D集成**: 基于BaseTool实现自定义测量工具 2. **统计计算**: 实现像素遍历和统计值计算 3. **状态管理**: 通过Redux集成到现有测量系统 4. **UI集成**: 无缝集成到测量面板和查看器 ### 扩展性考虑 1. **配置驱动**: 通过MEASUREMENT_TOOL_CONFIGS支持新工具快速接入 2. **模态支持**: 基础架构支持不同DICOM模态的灰度处理 3. **多视口**: 完整的多视口支持和批量操作