功能描述:用户可以在医学图像上绘制矩形选区,系统自动计算该选区内的平均灰度值并显示测量结果。
需求要点:
| 参与者 | 职责描述 | 交互方式 |
|---|---|---|
RectangleGrayscaleMeasurementTool |
矩形区域灰度测量工具主类 | 实现测量逻辑 |
MeasurementToolManager |
测量工具管理器 | 统一管理所有测量工具 |
StackImageViewer |
图片查看器组件 | UI界面和工具注册 |
ViewerContainer |
查看器容器 | 事件分发和状态管理 |
MeasurementPanel |
测量控制面板 | UI控制器 |
RectangleGrayscaleMeasurementTool类分析:
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 │
◀─────────────────────── │
测量面板初始化 → MEASUREMENT_TOOL_CONFIGS映射 →
CurrsorResetListener注册 → Tool注册
用户点击 → Redux Action分发 → measurementAction更新 →
useEffect触发 → MEASUREMENT_TOOL_CONFIGS查找 →
配置对象提取 → activateMeasurementTool调用 →
MeasurementToolManager方法执行 → StackImageViewer函数调用
ToolGroup增加工具 → 工具设置为active模式 →
_modify激活 → AnnotationManager添加默认标注 →
EnabledElement获取 → _updateCachedStats更新统计数据 → 界面更新
Canvas获取 → imageData提取 →
pixelData数组处理 → 统计计算(Max/Min/Avg/StdDev) →
cachedStats更新 → 界面更新
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; // 单位
};
}
interface MeasurementToolConfig {
toolName: string; // 工具类名
activateFunction: Function; // 激活函数
logPrefix: string; // 日志前缀
}
interface CalculationParameters {
imageData: cornerstone.Types.IImageData; // 图像数据
rectanglePoints: Point3[]; // 矩形顶点
pixelSpacing: number[]; // 像素间距 [x,y]
modality: string; // 成像模态
}
起点: 用户在测量面板点击"矩形区域灰度"按钮
主要步骤:
选择viewport → 检查toolGroup →
添加RectangleGrayscaleMeasurementTool → 设置工具为active模式 →
激活修改功能 → 创建默认标注 → 更新缓存统计 → 触发渲染
获取图像数据 → 提取pixelData →
遍历矩形区域 → 累加像素值 →
计算Max/Min/Sum/Count → 计算Average和StdDev → 格式化结果
| 测试场景 | 测试步骤 | 预期结果 |
|---|---|---|
| 正常使用场景 | 1. 点击"矩形区域灰度"按钮 2. 在图像上绘制矩形 3. 完成绘制 |
显示平均灰度值和统计信息 |
| CT图像测试 | 使用CT图像测试 | 显示HU值为负数,单位为HU |
| 多选区测试 | 在同一图像创建多个矩形 | 每个矩形独立显示统计信息 |
| 工具切换测试 | 使用后切换到其他测量工具 | 矩形标注保留,可以重新编辑 |
| 清除功能测试 | 使用"清除测量"功能 | 所有矩形标注消失 |
| 边界情况 | 测试方法 | 预期结果 |
|---|---|---|
| 空选区 | 绘制大小为0的矩形 | 显示警告或忽略操作 |
| 图像边界 | 绘制超出图像边界的矩形 | 自动裁剪到图像边界 |
| 小选区 | 选择1x1像素的矩形 | 显示单像素灰度值 |
| 大选区 | 选择覆盖整个图像的矩形 | 显示全局平均灰度值 |
启动应用程序
npm run h5:browser
# 或其他启动命令
点击"图像测量"打开测量面板
激活矩形区域灰度工具
在测量面板中找到"矩形区域灰度"按钮
点击按钮激活测量工具
执行测量
将鼠标移到图像上,鼠标指针变为测量工具样式
按下鼠标左键,开始绘制矩形
拖拽鼠标定义矩形区域
松开鼠标左键完成绘制
查看测量结果
观察矩形选区显示统计信息
检查是否显示平均灰度值、面积等
测试工具切换
激活其他测量工具,确认矩形标注保留
重新选择矩形工具,点击标注进行编辑
测试清除功能
在测量面板点击"清除测量"
确认所有标注被移除
src/components/measures/RectangleGrayscaleMeasurementTool.ts - 矩形灰度测量工具类
修改文件:
src/pages/view/components/viewers/stack.image.viewer.tsx - 添加工具注册和导出函数
src/utils/measurementToolManager.ts - 添加工具管理方法
src/pages/view/components/ViewerContainer.tsx - 添加激活函数导入
this.getToolGroup(viewportId)替换为MeasurementToolManager.getToolGroup(viewportId)