理解DICOM图像属性以获得轴向/冠状/矢状切片。

7

我必须编写一个可解析DICOM并显示轴位、冠状和矢状切片的c#程序。

看起来需要做很多工作,但是我必须这样做!

我想理解DICOM文件应该是个大的第一步。

我一直在阅读这篇教程http://dicomiseasy.blogspot.ru/ 但他使用的RZDCX库是我不允许购买的。

但是它仍然提供了一些关于DICOM属性的好的解释,并且我也阅读了标准的一些部分(尤其是第3部分)。

但是我仍然很难完全理解它们。有那些图像属性:像素表示、像素数据、平面配置......我想要能够显示图像,理解它们非常重要,我认为我应该学习更多关于像素实际工作的知识,以获得更好的理解。

但还有一件事情我真的搞不清:

如何或者在哪里获得这三个不同的切片?(轴位/冠状/矢状) 我在标准中寻找有关它们的属性,但是没有找到。所以也许我们可以通过某种计算来找到它们,但我不知道应该使用哪些变量和公式?


另外一个提示:您关心图像像素模块的属性以及如何正确解释不同的可能组合,您是正确的,这并不容易。假设您最终将使用DCMTK;-)来访问DICOM数据,则有一个名为DicomImage的类可以为您承担此负担。它提供了一个名为getInterData()的方法,您可以使用该方法以规范化的方式获取像素数据(即像素数据值已映射到实际世界范围,并存储为8、16或32位有符号/无符号整数)。这对于解决此问题非常有帮助。 - Markus Sabin
我目前正在查看DCMTK文档,我了解到getInterData()可能很有用,但这只允许获取一种像素表示(然后显示一张图像),对吧?我只是不明白如何从一个像素表示中提取3个不同的图像。 - Charrette
@Charnette:你不能这样做。图像类型(即用于表示像素值的类型)在构建图像时会隐式确定。使用getRepresentation()可以检索枚举类型(例如,无符号短整型EPR_Uint16)。使用它的好处是由DcmImage选择适当的类型,并且InterData包含真实的像素值,与DICOM文件中的PixelData元素不同,后者包含仍需通过模态LUT进行转换的数据。 - Markus Sabin
4个回答

12

没错,这是一个相当大的任务!在这里可能找不到可以为您提供逐步教程的人。但是以下是一些提示:

  1. DICOM标准有时看起来令人生畏,并需要开始陡峭的学习曲线。 DICOM Cookbook帮助我很多,使我熟悉术语和文档结构。
  2. 还有许多其他工具包可供使用,其中一些是免费的,并且采用非常自由的许可证,例如DCMTK。这些工具包消除了学习如何在各种略有不同的二进制格式中对信息进行编码的负担,并提供统一的API,可以相当容易地访问信息。我强烈建议不要从头开始编写自己的DICOM实现。
  3. 定义切片或帧的三维位置和方向的DICOM属性为ImagePositionPatient(0020,0032),ImageOrientationPatient(0020,0037)和PixelSpacing(0028,0030)。这些可以用于正确排序切片并计算插值交叉切片。
  • 确保查看增强型CT/MR信息对象定义。通常有两种方法将图像堆栈存储在DICOM中:单帧(每个图像一个文件)和多帧(一个文件用于一个或多个图像堆栈)。它们在您可以获取上述信息的方式上有所不同。
  • 希望对你有所帮助,祝好运!


    12

    这个问题已经有3年历史了,但也许我的答案对某些人会有所帮助。

    @user6867490已经提到了Roni Zaharia美丽的文章

    我想补充的唯一一件事是: 你可以通过编写以下内容来简单地访问图像定向(患者)标签(0020,0037):

    f = dicom.read_file(dicom_file_name)
    f.ImageOrientationPatient
    

    如果您获得:

    ['1', '0', '0', '0', '0', '-1'],那么您正在处理冠状面视图

    ['0', '1', '0', '0', '0', '-1'],那么您正在处理矢状面视图

    ['1', '0', '0', '0', '1', '0'],那么您正在处理轴向面视图

    在我的情况下,存在一个包含几个矢状面和大量轴向面(我实际上需要的)的数据集。因此,我只需遍历整个数据集并进行简单的逻辑比较,以过滤出所有矢状面。


    3

    这是一个用Python实现的查找IMA文件平面的方法。 参考: http://dicomiseasy.blogspot.com/2013/06/getting-oriented-using-image-plane.html

    import pydicom # for gettind information out of the IMA files
    import numpy as np
    
    """
    This function takes IOP of an image and returns its plane (Sagittal, Coronal, Transverse)
    """
    
    def file_plane(IOP):
        IOP_round = [round(x) for x in IOP]
        plane = np.cross(IOP_round[0:3], IOP_round[3:6])
        plane = [abs(x) for x in plane]
        if plane[0] == 1:
            return "Sagittal"
        elif plane[1] == 1:
            return "Coronal"
        elif plane[2] == 1:
            return "Transverse"
    
    a=pydicom.read_file("path\to\your\DICOM\file.IMA")
    IOP = a.ImageOrientationPatient
    plane = file_plane(IOP)
    

    0
    有时候你需要构建不同的视图。例如,如果你有一个CT图像集,这些图像是沿着主体轴向的,那么你可以通过适当地对图像集进行采样来制作自己的冠状面和矢状面切片。我会先编写代码,将你拥有的数据简单地显示出来作为起点。等到这个工作正常运行后,你就会更深入地了解问题所在。

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