You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中DICOM切片厚度设置:STL转DICOM切片间距异常问题

解决STL转DICOM序列的切片间距问题

要让ImageJ等软件识别正确的Z轴体素深度(切片间距),你需要修正ImagePositionPatient的Z轴值,并补充关键的DICOM元数据标签,具体修改如下:

核心修改点

  1. 动态设置每个切片的Z轴位置:每个切片的ImagePositionPatient第三个参数对应STL模型Z轴上的实际位置,确保切片在Z方向均匀分布
  2. 添加切片厚度相关标签:明确设置SliceThickness和SpacingBetweenSlices,直接定义切片间距,避免读取软件自动推断错误
  3. 设置InstanceNumber:保证DICOM序列能被正确排序

修改后的代码片段

# Loop 
for i in range(num_slices):
    # Here I process each slice as an image (img), and obtain an array
    arr = pil_to_ndarray(img)     
    
    # DICOM conversion
    arr = arr.astype(np.float16)
    ds = pydicom.dataset.FileDataset(os.path.join(slice_folder, f'slice_{i}.dcm'), \
                                     {}, file_meta=pydicom.dataset.FileMetaDataset())
    
    # 保留原有的DICOM元数据设置(PixelData、PhotometricInterpretation等)
    ds.PixelData = arr.tobytes()
    ds.SamplesPerPixel = 1
    ds.PhotometricInterpretation = 'MONOCHROME2'
    ds.Rows, ds.Columns = arr.shape[:2]
    ds.BitsAllocated = 16
    ds.BitsStored = 16
    ds.HighBit = 15
    ds.PixelRepresentation = 1
    ds.RescaleIntercept = 1 
    ds.RescaleSlope = -1000/15360
    ds.WindowCenter = np.max(arr) / 2
    ds.WindowWidth = np.max(arr)
    
    # Conversion from pixel size to real units
    ds.PixelSpacing = [pixel_dist_x, pixel_dist_y]

    # --- 以下是修改的核心部分 ---
    # 计算当前切片的Z轴位置(从STL的zmin开始,逐片累加slice_height)
    current_z = zmin + i * slice_height
    # 设置ImagePositionPatient:X、Y设为0,Z为当前切片的实际位置
    ds.ImagePositionPatient = [0.0, 0.0, current_z]
    # 保持图像方向不变
    ds.ImageOrientationPatient = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0]
    
    # 明确设置切片厚度和间距,与计算的slice_height一致
    ds.SliceThickness = slice_height
    ds.SpacingBetweenSlices = slice_height
    
    # 设置InstanceNumber,确保序列排序正确
    ds.InstanceNumber = i + 1
    
    # 保留原有的其他元数据设置
    ds.PatientName = 'Name'
    ds.PatientID = 'ID'    
    ds.Modality = 'CT'
    ds.InstanceCreationDate = datatime.strftime('%Y%m%d')
    ds.InstanceCreationTime = datatime.strftime('%H%M%S.%f')

    # Save the DICOM file
    ds.save_as(os.path.join(slice_folder, f'slice_{i}.dcm'))

原理说明

  • 之前固定ImagePositionPatient的Z值为0,导致ImageJ无法通过相邻切片的位置差计算间距,只能默认使用PixelSpacing的X值作为体素深度
  • 动态设置Z轴位置后,软件可以通过相邻切片的ImagePositionPatient[2]差值得到真实的切片间距
  • SliceThickness和SpacingBetweenSlices是DICOM标准中定义切片物理属性的标签,直接设置后能让读取软件无需推断,直接获取正确参数

内容的提问来源于stack exchange,提问作者Vanhanen_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:22:16