脑出血血肿体积结果不显示

软件版本:5-8-1
问题描述:通过阈值法重建血肿,但是models模块下,information显示空白,怎么显示血肿体积呢?

这个现象通常是因为你在“Segment Editor/分割编辑器”里得到的是Segmentation 节点,而“Models/模型”模块的 Information 面板只对Model 节点(polydata)显示信息;如果还没生成闭合表面(Closed surface),模型信息就会是空白。血肿体积也不是在 Models 里看,而是用 Segment Statistics/分割统计 计算。


方案A(推荐):直接用 Segment Statistics 计算体积

  1. 分割:Segment Editor → 选择主图像为 Master volume → 阈值(Threshold)→ Apply

  2. 计算体积:打开 Segment Statistics 模块 → 选择你的 Segmentation 和参考数据(一般选主CT体数据)→ Apply

    • 关注 “Labelmap volume (cm³)” 或 “Closed surface volume (cm³)”。

    • cm³≈mL,血肿体积直接视为 mL。

提示:若统计表没有“cm³”,只见“mm³”,可自行除以1000得到 mL。

方案B:把分割导出为模型,再看模型信息并用统计

  1. Segmentations 模块(或分割节点右键)→ Export → 选 Models 导出。

  2. Models 模块,选中新生成的 Model 节点,此时 Information 才会显示点数/三角面数等(注意:Models面板本身不显示体积数值)。

也可以在python控制台界面直接粘贴下方代码,自动计算出体积数据。


import slicer
import vtk
import numpy as np

def get_first_seg_and_ref_volume():
    segs = slicer.util.getNodesByClass('vtkMRMLSegmentationNode')
    if not segs:
        raise RuntimeError("没有 Segmentation 节点。请先用 Segment Editor 做阈值分割并 Apply。")
    seg = segs[0]
    ref = seg.GetNodeReference(
        slicer.vtkMRMLSegmentationNode.GetReferenceImageGeometryReferenceRole()
    )
    if ref is None:
        vols = slicer.util.getNodesByClass('vtkMRMLScalarVolumeNode')
        if not vols:
            raise RuntimeError("没有体积节点 (ScalarVolume)。请先载入 CT/MR。")
        ref = vols[0]
    return seg, ref

def voxel_count_volume(seg, ref):
    logic = slicer.modules.segmentations.logic()
    segObj = seg.GetSegmentation()
    nSeg = segObj.GetNumberOfSegments()
    results = {}
    for i in range(nSeg):
        sid = segObj.GetNthSegmentID(i)
        name = segObj.GetSegment(sid).GetName()
        ids = vtk.vtkStringArray()
        ids.InsertNextValue(sid)
        lm = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLLabelMapVolumeNode', f'_tmp_{name}_LM')
        ok = logic.ExportSegmentsToLabelmapNode(seg, ids, lm, ref)
        if not ok or lm.GetImageData() is None:
            # 段为空或导出失败
            slicer.mrmlScene.RemoveNode(lm)
            results[name] = None
            continue
        arr = slicer.util.arrayFromVolume(lm)
        count = int((arr > 0).sum())
        sx, sy, sz = lm.GetSpacing()
        v_mm3 = count * sx * sy * sz
        v_mL = v_mm3 / 1000.0
        results[name] = v_mL
        slicer.mrmlScene.RemoveNode(lm)
    return results

# 主入口
seg, ref = get_first_seg_and_ref_volume()
volumes = voxel_count_volume(seg, ref)

print(f"参考体积: {ref.GetName()}")
print("=== 各段体积(mL) ===")
for name, vol in volumes.items():
    if vol is None:
        print(f"{name}: 无法计算(导出失败或段为空)")
    else:
        print(f"{name}: {vol:.3f} mL")

感谢曹教授指导 :hand_with_index_finger_and_thumb_crossed: