如何勾画线段或者距离之间的ROI

软件版本
问题描述:在进行阿尔兹海默病研究过程中。需要勾画脉络膜裂宽度,颞角宽度,海马回钩距间距等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 视图实时显示。

  1. 载入影像并锁定观察平面

    • Data → 右键影像 → Create “Axial” / “Coronal” / “Sagittal” slice views
    • Slice View 点击 :pushpin: 图标,锁定切迹,避免误碰。
  2. 创建测量节点

    • MarkupsAdd new Markups Line。重命名为 CFW_LRTHW_LRUncal_Dist 等,便于批处理和表格导出。
  3. 放置测量点

    • 切到冠状位。放置 Ctrl + 左键(或右键菜单 Place one point)。
    • 第 1 点放在左侧结构内缘,第 2 点放右侧内缘。完成后即显示距离,精确到 0.01 mm。
    • 若要同时记录多个指标,可先切换 Persistent Place Mode,按顺序完成全部测量,再退出。
  4. 核对与导出

    • Markups 下方 Measurements 表会实时更新。
    • 点击 ExportCSVJSON 便于后续统计。
    • 点数/线可通过 Ctrl + Shift + 滚轮 在 3D 窗中调整可视化粗细,提高截图清晰度。

经验要点:对单个受试者测量多次 → 取平均;两名观察者重复测量 → 计算 ICC 提供可信度。

相关界面与快捷键可参见官方 Markups 文档 (slicer.readthedocs.io),以及社区“Distance measurement”系列讨论 (discourse.slicer.org, discourse.slicer.org)。


三、半自动分割 + Python 批量提取(适合大样本)

若样本数 > 50,推荐先进行解剖分割,再按算法自动抽取「最大内径」或「最短距离」。

  1. 批量粗分割

    • Segment EditorThreshold & Islands 先分出侧脑室、CSF。
    • 对海马可用 Grow from Seeds(种子点:灰质 & 白质)或 external AI 模块(DeepSegment)。
  2. 转为几何轮廓

    • SegmentationsExport to models (closed surface),得到 STL/VTP。
  3. 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 里批量循环所有病例目录。
  4. 自动化质量检查

    • 调用 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 等基层指南保证测量方案与国际通用定义一致。