在本机Python中解析DICOM文件

时间:2008-09-23 07:53:50

标签: python image format dicom medical

解析DICOM文件的最简单,最pythonic的方法是什么?

不使用非Python库的本机Python实现将是更受欢迎的。 DICOM是数字医疗成像中的标准文件格式(有关更多信息,请查看here)。

有一些C / C ++库支持读取(子集)DICOM文件。其中两个或三个甚至都有Python绑定。本机Python解析器对我来说有两个目的:

  1. 无需构建任何外部C / C ++库。
  2. 了解DICOM文件格式。

9 个答案:

答案 0 :(得分:21)

截至今天,还有另一个纯Python包,可以读取DICOM文件:pydicom

答案 1 :(得分:18)

这些天我大量使用pydicom,它摇滚。

开始玩它很容易:

import dicom 
data = dicom.read_file("yourdicomfile.dcm")

要从“数据”对象中获取有趣的东西,以某种方式类似于dcmdump输出:

for key in data.dir():        
    value = getattr(data, key, '')
    if type(value) is dicom.UID.UID or key == "PixelData":
        continue

    print "%s: %s" % (key, value)

我认为了解更多关于dicom格式的一个好方法是打开类似的文件并编写代码,根据各个方面进行比较:研究描述,窗口宽度和中心,像素表示等。

玩得开心! :)

答案 2 :(得分:9)

如果您想了解DICOM格式,Oleg Pianykh的“医学数字成像和通信(DICOM):实用入门和生存指南”非常易读,并对关键的DICOM概念进行了很好的介绍。 Springer-Verlag是本书的出版商。当然,完整的DICOM标准是最终的参考,尽管它有点令人生畏。它可以从NEMA(http://medical.nema.org)获得。

文件格式实际上不如您想象的那么深奥,并且由前导码后跟一系列数据元素组成。前导码包含ASCII文本“DICM”和几个未使用的保留字节。序言之后是一系列数据元素。每个数据元素由元素的大小,表示值表示的双字符ASCII码,DICOM标记和值组成。文件中的数据元素按其DICOM标记号排序。图像本身只是另一个具有大小,值表示等的数据元素。

值表示确切地指定了如何解释该值。这是一个数字吗?它是一个字符串吗?如果是字符串,是短字还是长字,允许哪些字符?值表示代码告诉您。

DICOM标记是一个4字节的十六进制代码,由2字节“组”编号和2字节“元素”编号组成。组号是一个标识符,用于告诉您标签应用于哪个信息实体(例如,组0010指的是患者,组0020指的是研究)。元素编号标识值的解释(诸如患者的ID号,系列描述等项目)。要了解如何解释该值,您的代码将在字典文件中查找DICOM标记。

还涉及其他一些细节,但这就是它的本质。您可以做的关于文件格式最有启发性的事情是获取一个示例DICOM文件,使用十六进制编辑器查看它,并完成在心理上解析它的过程。我建议不要试图通过查看现有的开源实现来了解DICOM,至少在最初阶段。它更容易混淆而不是启发。全局了解更为重要。一旦你掌握了全局,那么你就可以陷入微妙之中。

答案 3 :(得分:7)

上面提到的库pydicom看起来像是一个访问DICOM数据结构的好库。用它来访问例如RT DOSE数据,我想有人会做类似

的事情
import dicom,numpy
dose = dicom.ReadFile("RTDOSE.dcm")
d = numpy.fromstring(dose.PixelData,dtype=numpy.int16)
d = d.reshape((dose.NumberofFrames,dose.Columns,dose.Rows))

然后,如果你在mayavi,

from enthought.mayavi import mlab
mlab.pipeline.scalar_field(d)

这会给出错误的坐标和剂量缩放,但原则应该是合理的。

CT数据应该非常相似。

答案 4 :(得分:4)

现在发生了更新的gdcm开发:

http://gdcm.sourceforge.net/

它支持python上的Java和C#。

为什么要编写又一个 dicom实现,当您可以集中单个C ++实现并让它可以访问这么多不同的语言时

答案 5 :(得分:3)

几年前我一直在寻找相同的东西并发现了这个: Python DICOM lib

我对代码印象不是很深刻,但它是本机Python读取DICOM文件。

答案 6 :(得分:2)

DICOM是一个真正的痛苦......即使制造商坚持标准。如果您编写自己的DICOM库,您会发现不同的制造商DICOM与其他供应商实际上不兼容[需要引证]。

我(在我的业余时间)尝试编写一个C dicom解析器从一个漂亮的小型Ruby解析器中大量借用,我巧妙地称之为“ruby-dicom”。它实际上是非常易读的代码(我看了一个较小的早期版本)。

最令人头痛的是试图用预期的数据类型来收集标题标记库。有标准定义的标签和供应商标签。 ruby-dicom文件包含一个文本格式的标签库,可以轻松检查。

我放弃了官方文献,因为我只对文件格式感兴趣,而文件格式似乎只是10个左右的巨大PDF文件之一。

我的本​​地DICOM文件没有压缩,遵循标准的易编码位排列,但要准备好各种压缩和存储在8位容器中的奇怪的12位图像,这些容器具有大或小的字节顺序且没有填充位...

一旦时间变得非常稀缺,我就放弃了。

对于这种样式的头文件解析,Python可能是比C更好的选择......

答案 7 :(得分:1)

有些库(通常用C / C ++实现)带有Python绑定,例如:

但是,我正在寻找本机Python实现来了解有关DICOM文件格式的更多信息。

答案 8 :(得分:0)

我想知道原始海报尝试了什么以及哪些方法有效并且不适用于他。我从未使用过DICOM,但快速谷歌搜索“DICOM python”给了几个有趣的结果。似乎这个项目:http://www.creatis.univ-lyon1.fr/Public/Gdcm/应该提供你想要的东西。它有python绑定和非常活跃的邮件列表。