如何将 DICOM 文件中的存储值转换为真实世界的单位?

How to transform stored values in a DICOM file to real world units?

我正在尝试使用 Matlab 或 python 计算 PET DICOM 图像上的放射性浓度。我在 DICOM 标准中读到

(0028,1053) Rescale Slope    
(0028,1052) Rescale Intercept

可用于将存储的 16 位单位(在我的例子中)映射到实际单位。这些文件还包含以下元素:

(0040,9096) Real World Value Mapping Sequence    
(0028,9145) Pixel Value Transformation Sequence 

作为 (5200,9230) Per Frame Functional Groups Sequence(对于动态测量中的每个帧)或 (5200,9229) Shared Functional Groups Sequence(对于静态测量)的一部分。这些序列还包含重新调整斜率和截距。这些值彼此匹配(对于给定帧,(0040,9096) Real World Value Mapping Sequence(0028,9145) Pixel Value Transformation Sequence 值相同)但它们与 "main" 斜率和截距的值不匹配(即PET 图像模块的属性)。例如,在使用 pydicom 作为 ds 读取动态 multi-frame 文件后:

#This is the "main" slope, part of the PET Image module    
>ds.RescaleSlope  
Out[31]: "0.478081"

#This is a dynamic image, for a static image SharedFunctionalGroupsSequence would be used
>ds.PerFrameFunctionalGroupsSequence[0].PixelValueTransformationSequence[0].RescaleSlope
Out[34]: "104.435089"

>ds.PerFrameFunctionalGroupsSequence[0].RealWorldValueMappingSequence[0].RealWorldValueSlope
Out[38]: 104.43508911132812

我的问题如下:我如何正确应用这些转换以从像素值中获取真实世界的单位(例如:Bq/ml,如 header 中所述)?我是否需要同时乘以 ds.RescaleSlope 和 RealWorldValueSlope? (在我的例子中截距总是 0)。这似乎违反直觉,因为 dicom 标准 states 这两个值实际上彼此没有任何关系,但是 ds.RescaleSlope 有什么作用?

感谢任何帮助。

如果遵循 David Clunie in this post,在这种情况下应使用 Real World Value Mapping Sequence,如果不支持,Rescale/Slope 将作为后备。我自己还没有使用 Real World Value Mapping Sequence(如果存在,总是在显示管道中应用模态 LUT),所以我对此并不完全确定...