Python中DICOM切片厚度设置:STL转DICOM切片间距异常问题
解决STL转DICOM序列的切片间距问题
要让ImageJ等软件识别正确的Z轴体素深度(切片间距),你需要修正ImagePositionPatient的Z轴值,并补充关键的DICOM元数据标签,具体修改如下:
核心修改点
- 动态设置每个切片的Z轴位置:每个切片的
ImagePositionPatient第三个参数对应STL模型Z轴上的实际位置,确保切片在Z方向均匀分布 - 添加切片厚度相关标签:明确设置
SliceThickness和SpacingBetweenSlices,直接定义切片间距,避免读取软件自动推断错误 - 设置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_
相关产品推荐
相关产品推荐

