如何修改Python代码实现DICOM RT Dose体素值与浮点数常量相乘?
解决RT Dose DICOM文件体素值与浮点数常量相乘的问题
问题根源
你的代码在使用整数相乘时,numpy数组的dtype和原始DICOM数据保持一致(比如uint16),转成字节后能正确写入文件;但用浮点数相乘时,数组会自动转为浮点类型,直接写入PixelData会导致数据类型不匹配。另外,RT Dose的真实剂量值是由PixelData和DoseGridScaling元数据共同计算的,直接修改像素值会破坏这个标准对应关系。
推荐解决方案(符合DICOM标准)
RT Dose的真实剂量计算公式为:真实剂量 = PixelData值 × DoseGridScaling。因此,想要将所有剂量值乘以任意常量(整数/浮点数),只需修改DoseGridScaling的值即可,无需改动像素数组,这种方式兼容性更好、效率更高。
修改后的代码:
import os import pydicom # 目录路径 directory_path = r'D:\RT Dose' # 支持整数或浮点数常量 constant_value = 2.8 for filename in os.listdir(directory_path): if filename.endswith(".dcm"): file_path = os.path.join(directory_path, filename) rt_dose = pydicom.dcmread(file_path) # 直接修改剂量缩放因子,实现剂量值整体相乘 rt_dose.DoseGridScaling *= constant_value # 保存修改后的文件 output_file_path = os.path.join(directory_path, f"modified_{filename}") rt_dose.save_as(output_file_path) print(f"Modified file saved as: {output_file_path}")
备选方案(直接修改像素值,不推荐)
如果坚持要直接修改像素数组,需要先计算真实剂量值,乘以常量后再转换回原始整数类型,同时保证和DoseGridScaling的对应关系,这种方式可能丢失精度且兼容性较差。
示例代码:
import os import pydicom import numpy as np directory_path = r'D:\RT Dose' constant_value = 2.8 for filename in os.listdir(directory_path): if filename.endswith(".dcm"): file_path = os.path.join(directory_path, filename) rt_dose = pydicom.dcmread(file_path) dose_data = rt_dose.pixel_array # 计算真实剂量值,乘以常量后转换回原始像素类型 real_dose = dose_data * rt_dose.DoseGridScaling modified_real_dose = real_dose * constant_value modified_dose_data = np.round(modified_real_dose / rt_dose.DoseGridScaling).astype(dose_data.dtype) rt_dose.PixelData = modified_dose_data.tobytes() output_file_path = os.path.join(directory_path, f"modified_{filename}") rt_dose.save_as(output_file_path) print(f"Modified file saved as: {output_file_path}")
内容的提问来源于stack exchange,提问作者aseman
相关产品推荐
相关产品推荐

