我正在开发基于 dcm4che 的 java 应用程序时的一个简单问题...
我想计算/找到一个 dicom 图像的“位置”到它的序列(系列)中。通过位置,我的意思是查找此图像是否是其系列中的第一个、第二个等。更具体地说,我想计算/找到:
序列中的切片数
每个切片(dicom 图像)在序列中的位置
对于第一个问题,我知道我可以使用标签 0020,1002(但它并不总是被填充)......对于第二个问题?
如果您正在处理体积图像系列,订购系列的最佳方式是使用图像位置(患者)(0020、0032)。这是一个必需的类型 1 标签(应该总是有值),它是图像平面模块的一部分。它将包含代表图像左上角的 X、Y 和 Z 值坐标,以 mm 为单位。如果切片彼此平行,则切片之间仅应改变一个值。请注意,切片位置 (0020, 1041) 是可选的(类型 3)元素,它可能不存在于 DICOM 文件中。
我们使用 InstanceNumber 标签 (0x0020, 0x0013) 作为切片位置的首选。如果没有 InstanceNumber,或者它们都相同,那么我们使用 SliceLocation 标签 (0x0020, 0x1041)。如果两个标签都不可用,那么我们就放弃。
我们检查 InstanceNumber 标签,使得 Max(InstanceNumber) - Min(InstanceNumber) + 1 等于我们在序列中拥有的切片数(以防某些制造商从 0 或 1 开始计数,甚至是其他数字) . 我们以同样的方式检查 SliceLocation。
然后这个 max - min + 1 就是序列中的切片数(代替标签 ImagesInAcquisition 0x0020, 0x1002)。
如果没有 ImagesInAcquisition 标签,我们就无法提前知道需要多少切片......
我会争辩说,如果切片位置可用,请使用它。与图像采集更加一致。如果它不可用,那么您将不得不使用或计算图像位置(患者)属性。第 3 部分 C.7.6.2.1 节详细介绍了这些属性。
当你有一个倾斜的系列时,主要问题就出现了。如果您只使用图像位置(患者)的 z 值,它可能不会因切片属性之间的切片厚度/间距而改变,而切片位置通常会改变。这可能会导致最终用户感到困惑。