如何将 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),所以我对此并不完全确定...
我正在尝试使用 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),所以我对此并不完全确定...