如何计算用于MPR的DICOM切片之间的间距?

8
由于要展示基于Dicom的MPR视图。我从一系列Dicom文件中创建了一个3D数组。然后我从冠状面和矢状面显示它。
My 3D array includes: 

 - z = count of dicoms
 - c = column value for every dicoms
 - r = Row value for every dicoms

但我有一个问题。当切片之间有一些空间时,用这种方式制作的图像不会显示正确的视图。因为我无法想象它们之间的模拟距离!

我不知道如何计算切片之间的空间?我想在切片之间添加额外的空间。例如,如果切片之间的空间是4,我必须添加4个z轴内部切片。

我希望我的意思能够理解。

3个回答

23
图像位置(患者)和图像方向(患者)是计算切片间距离时您应该使用的唯一两个属性。有关更多详细信息,请参见此处此处。要查看实际实现,请参见此处,该实现还考虑了参考框架UID以及旋转角度(Gantry/Detector Tilt)。
这个问题是在comp.protocols.dicom上最常问的问题之一。
请参见ImageJ bug
我认为@Matt的答案是错误的,让我在这里澄清一些事情。
- 不:'DICOM没有一个叫做“Spacing Between Slices”的属性。那是非常错误的(从技术上来说,它甚至没有任何意义)。
DICOM定义了IODs,这些IODs定义了SOP类实例中可用的必需属性集合。让我们考虑两种非常常见的情况:CT图像存储(传统)和MR图像存储(传统)。所以我们需要比较两者之间的属性集合:
1. CT Image IOD Modules 2. MR Image IOD Modules 现在假设我们想要检查MR图像存储是否支持“Spacing Between Slices”,很容易跳转到:

然而,对于CT图像存储来说,要找到这个属性要困难得多:因为这个属性在标准中并不存在。所以你只能在扩展的SOP类(某些供应商可能认为切片间距属性在他们的扩展的SOP类实例中是有意义的)中找到这个属性。

  • 在同一个答案中混合使用切片间距和切片厚度(0018,0050)对新用户来说非常令人困惑。

我同意切片厚度在标准中已经完美定义了,无论是CT图像存储还是MR图像存储,因为它们都包括图像平面模块属性,但我们不要把一个换成另一个。

我在这里找到了一个关于切片厚度与切片间距的很好的总结(如果你滚动到该部分,甚至可以播放小演示):

在逐步拍摄CT中,切片厚度和切片之间的间距是相同的,因此这里没有大问题。然而,在螺旋CT中,这些值并不相同,可以在任何方向上变化(它们是独立的)。

切片厚度由探测器宽度和螺距确定, 而重建间隔(=切片间间隔)可以任意选择。[...]

总之,为了(安全地!)计算切片间间隔(=重建间隔),最好使用图像定位(患者)和图像位置(患者),因为它们在MR图像存储或CT图像存储实例中都是可用的。


在CP-2061之前,所有上述内容都是针对将属性移动到图像平面模块并使其现在可用于CT的情况进行编写的。

你介意解释一下为什么只有这两个应该被考虑吗? - Francesco Pasa
@FrancescoPasa 我已经引用了两个链接。你想让我复制/粘贴这里描述的内容吗? - malat
1
你是正确的,我对这个愚蠢的问题感到抱歉。基本上这是因为在机器和软件之间可能存在Slice Thickness(0018, 0050)和Spacing Between Slices(0018,0088)属性的不一致,而且距离会根据需要进行实时调整,对吗? - Francesco Pasa
1
@FrancescoPasa 是的,我已经更新了我的答案,指向一个小的Java演示来理解原理。 - malat

17
DICOM有一个称为间隔层之间距离(0018,0088)的属性,它给出了两个相邻切片之间的距离(垂直于图像平面),还有一个称为切片厚度(0018,0050)的属性,它给出了成像切片的厚度(图像平面位于切片中心,其上半体积和下半体积各占一半)。 图像位置(患者)(0020,0032)和图像方向(患者)(0020,0037)也是计算切片之间空间关系的有用属性。
更详细的说明,请参见DICOM标准第3部分C.7.6.2节(第409页)。

警告:请注意,不同的供应商使用相同的DICOM标签来寻址不同的内容。例如,属性间距(0018, 0088)根据厂商不同而有两种不同的意义。请查看this table以获得指南,并查看this thread以获取解释。


感谢@Matt的回答。我已经使用SpacingBetweenSlices(0018,0088)来模拟切片之间的间距。我应该使用SliceThickness(0018,0050)来计算实际间距吗?如果是,为什么? - Omid Nazifi
1
你需要这两个信息。切片厚度告诉你哪个空间区域对给定切片的像素值做出了贡献。如果切片厚度小于切片间距,则在切片之间存在未成像的间隙区域。如果切片厚度大于切片间距,则切片重叠(存在一个区域同时为相邻两个切片提供信息)。 - Matt
1
请参考@malat的答案,不应该依赖于切片之间的间距或切片厚度来计算切片之间的间隔。 - Dese
@dese 你对我的回答读多了。我没有倡导任何特定的方法。我只是指出了一些与主题相关的属性,并引导 OP 阅读详细手册,这是该主题的最终权威。 - Matt

2
如前面的答案所述,如何计算DICOM切片之间的间距并不是一件简单的事情。我们可以换个方式来问:如何将DICOM切片存储在一个三维体积中,即一个等间距切片的列表,以便进行渲染(猜测您想上传到3D纹理中)。
这是因为CT切片实际捕获的位置可能与放射科医生选择的位置不完全相同。数据集可能被配置为捕获1毫米的切片,但CT返回的切片位置可能是0.0毫米、0.997毫米、2.010毫米等。
如果使用Spacing Between Slices等属性来计算3D体积的大小,很容易出现微小的舍入误差。不要这样做。
相反,必须使用Image Position (Patient) (0020, 0032),然后执行优化来确定如何将切片适合于一个网格中。
需要考虑的实际问题有:
- 缺失的切片(插值?缺口?) - 步长不一致的切片(硬件缺陷?数据缺陷?)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接