软件版本:5-8-1
问题描述:通过阈值法重建血肿,但是models模块下,information显示空白,怎么显示血肿体积呢?
这个现象通常是因为你在“Segment Editor/分割编辑器”里得到的是Segmentation 节点,而“Models/模型”模块的 Information 面板只对Model 节点(polydata)显示信息;如果还没生成闭合表面(Closed surface),模型信息就会是空白。血肿体积也不是在 Models 里看,而是用 Segment Statistics/分割统计 计算。
方案A(推荐):直接用 Segment Statistics 计算体积
-
分割:Segment Editor → 选择主图像为 Master volume → 阈值(Threshold)→ Apply。
-
计算体积:打开 Segment Statistics 模块 → 选择你的 Segmentation 和参考数据(一般选主CT体数据)→ Apply。
-
关注 “Labelmap volume (cm³)” 或 “Closed surface volume (cm³)”。
-
cm³≈mL,血肿体积直接视为 mL。
-
提示:若统计表没有“cm³”,只见“mm³”,可自行除以1000得到 mL。
方案B:把分割导出为模型,再看模型信息并用统计
-
在 Segmentations 模块(或分割节点右键)→ Export → 选 Models 导出。
-
到 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")
感谢曹教授指导 ![]()
