软件版本:
问题描述:在进行阿尔兹海默病研究过程中。需要勾画脉络膜裂宽度,颞角宽度,海马回钩距间距等ROI,目前只知道测量这些距离,要勾画两个不同解剖部位的距离,请教老师怎样勾画
下面给出一套在 3D Slicer (≥5.6) 中精确勾画并测量「脉络膜裂宽度」「颞角宽度」「海马回钩—对侧钩距」等 ROI 的完整工作流。流程分为「测量定义 → 手动 Markups 流程 → 半自动分割 + Python 批量提取 → 数据导出与质控」四段,方便您按项目深度逐步展开。
一、测量前的技术约定
指标 | 参考平面 | 解剖定位要点 | 典型 AD 研究文献 |
---|---|---|---|
脉络膜裂宽度 (CFW) | 冠状位,通过松果体后缘 | 取两侧脉络膜裂内缘最高锐角处 | Scheltens MTA 评分系统 (radiologyassistant.nl, radiopaedia.org) |
颞角宽度 (THW) | 冠状位,通过松果体前缘 | 取侧脑室颞角内缘最宽截面 | Radial‐Width-of-Temporal-Horn 研究 (pmc.ncbi.nlm.nih.gov) |
海马回钩间距 (Uncal-to-Uncal Distance) | 冠状位,通过海马头最大截面 | 两侧钩突最内侧皮层之间的直线距离 | MRI 脑萎缩年龄队列 (pmc.ncbi.nlm.nih.gov) |
建议像序列:3D MPRAGE / MP2RAGE,1 mm 等体素,便于重建到一致解剖平面,测量误差 <0.5 mm。
二、快速手动测量(Markups Line)
适合少量病例或建立操作原型。所有操作均来自 Markups 模块,可在 2D/3D 视图实时显示。
-
载入影像并锁定观察平面
- Data → 右键影像 → Create “Axial” / “Coronal” / “Sagittal” slice views。
- 在 Slice View 点击
图标,锁定切迹,避免误碰。
-
创建测量节点
- Markups → Add new Markups Line。重命名为
CFW_LR
、THW_LR
、Uncal_Dist
等,便于批处理和表格导出。
- Markups → Add new Markups Line。重命名为
-
放置测量点
- 切到冠状位。放置 Ctrl + 左键(或右键菜单 Place one point)。
- 第 1 点放在左侧结构内缘,第 2 点放右侧内缘。完成后即显示距离,精确到 0.01 mm。
- 若要同时记录多个指标,可先切换 Persistent Place Mode,按顺序完成全部测量,再退出。
-
核对与导出
- Markups 下方 Measurements 表会实时更新。
- 点击 Export → CSV 或 JSON 便于后续统计。
- 点数/线可通过 Ctrl + Shift + 滚轮 在 3D 窗中调整可视化粗细,提高截图清晰度。
经验要点:对单个受试者测量多次 → 取平均;两名观察者重复测量 → 计算 ICC 提供可信度。
相关界面与快捷键可参见官方 Markups 文档 (slicer.readthedocs.io),以及社区“Distance measurement”系列讨论 (discourse.slicer.org, discourse.slicer.org)。
三、半自动分割 + Python 批量提取(适合大样本)
若样本数 > 50,推荐先进行解剖分割,再按算法自动抽取「最大内径」或「最短距离」。
-
批量粗分割
- Segment Editor → Threshold & Islands 先分出侧脑室、CSF。
- 对海马可用 Grow from Seeds(种子点:灰质 & 白质)或 external AI 模块(DeepSegment)。
-
转为几何轮廓
- Segmentations → Export to models (closed surface),得到 STL/VTP。
-
Python 提取(示例脚本片段)
import slicer, numpy as np # ❶ 获取左右脉络膜裂表面点云 cf_seg = slicer.util.getNode('CF_Fissure') left_pts, right_pts = [np.array(seg.GetClosedSurfaceRepresentation(0).GetPoints().GetData()) for seg in (cf_seg_left, cf_seg_right)] # ❷ 计算最短欧氏距离 from scipy.spatial.distance import cdist cfw_mm = cdist(left_pts, right_pts).min() * cf_seg.GetSpacing()[0] # 假设各向同性 print('Choroidal fissure width =', round(cfw_mm, 2), 'mm') # ❸ 存入表格节点 tableNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLTableNode","AD_ROI_Measure") slicer.util.updateTableFromArray(tableNode, np.array([['CFW', cfw_mm]]))
- 将脚本保存为
measure_AD_ROI.py
,在 Python Interactor 里批量循环所有病例目录。
- 将脚本保存为
-
自动化质量检查
- 调用
slicer.modules.segmentstatistics.logic().GetAllSegmentationStatistics()
自动输出体积、表面积,筛查异常值。 - 对生成的表格,建议 Pandas/Excel 里加上 ±2SD 范围,高亮跳脱值快速复审。
- 调用
四、结果管理与科研规范
步骤 | 关键操作 | 注意事项 |
---|---|---|
重建一致平面 | Reformat → Copy/Link slice orientation | 必须确保不同受试者 slice plane 和松果体基准面一致,否则误差 >1 mm |
命名规范 | PID_CFW_YYYYMMDD 等 |
项目大规模采集时便于 LIMS / REDCap 关联 |
版本记录 | 保存 .mrml + .json Parameters | 方便将来重演测量(FAIR 原则) |
数据安全 | 导出 CSV 前,删除 DICOM Header | 防止 PHI 泄露 |
结语
- 起步快:先用 Markups Line 跑通单例实验,熟悉定位;
- 规模化:分割 + Python,批量导出 CSV;
- 学术可信:参考 Scheltens MTA 等基层指南保证测量方案与国际通用定义一致。