2008-09-23 143 views
17

什么是解析DICOM文件的最简单和最Python的方式?了本机Python解析DICOM文件

不使用非Python库的原生Python实现会更喜欢。 DICOM是数字医学成像中的标准文件格式(有关更多信息,请参阅here)。

存在支持的DICOM文件中读取(子集)的一些C/C++库。其中两三个甚至有Python绑定。一个本地的Python解析器将为我提供两个目的:

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

回答

18

而作为今天的还有另一个可用的纯Python包阅读DICOM文件:pydicom

0

我不知道楼主尝试和方法的工作,而不是为他工作。我从来没有与DICOM合作过,但是对“DICOM python”的快速搜索给出了一些有趣的结果。看来这个项目:http://www.creatis.univ-lyon1.fr/Public/Gdcm/应该提供你想要的。它有python绑定和一个相当活跃的邮件列表。

+0

这是一个问题,“请为我做我的功课”? – 2008-09-23 10:00:16

+0

不,恕我直言,我做了我的功课:有一些C/C++库支持DICOM文件的阅读(一个子集)。其中两三个甚至有Python绑定。 本地Python解析器对我来说有两个目的: 1.无需构建任何C/C++库。 2.了解DICOM文件格式。 – 2008-09-23 12:38:01

1

没有与Python绑定一些库(通常在C/C++实现的),例如:

不过,我正在寻找一个原生的Python执行以了解更多关于DICOM文件格式。

+0

这两个链接都显得烂烂 – 2018-01-26 20:57:47

3

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

我没有与代码太深刻的印象,但它是原生的Python读物DICOM文件。

9

如果您想了解DICOM格式,“数字成像和通信医学(DICOM):实用简介及生存指南“作者Oleg Pianykh非常具有可读性,可以很好地介绍DICOM的关键概念。 Springer-Verlag是本书的出版商。当然,完整的DICOM标准是最终的参考标准,尽管它更具威胁性。它可从NEMA获得(http://medical.nema.org)。

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

值表示指定究竟如何解释值的另一个数据元素。这是一个数字吗?它是一个字符串吗?如果是字符串,是短的还是长的,哪些字符是允许的?值表示代码告诉你这一点。

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

还有一些其他的细节,但这是它的本质。学习文件格式可能最有教育意义的事情是拿一个DICOM文件的例子,用一个十六进制编辑器来查看它,然后通过精神解析它的过程。我建议不要尝试通过查看现有的开源实现来了解DICOM,至少在最初阶段。它更容易混淆而不是开导。获得大局面更重要。一旦你有了大局,那么你可以下降到微妙的地步。

4

较新的gdcm发展到现在发生在这里:

http://gdcm.sourceforge.net/

它支持在Python之上的Java和C#。

为什么写又一 DICOM实现时,你可以集中一个C++实现,也有它接触到这么多不同的语言

7

上面提到的似乎是用于访问DICOM数据结构一个伟大的图书馆图书馆pydicom。要使用它来访问例如RT剂量数据,我想一个会做类似

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数据应该非常相似。

17

这几天我大量使用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

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

我尝试了(在我的空闲时间)编写一个C语言的dicom解析器,借用了一个很好的Ruby解析器,我狡猾地称为'ruby-dicom'。它实际上是非常易读的代码(我查看了一个较小的早期版本)。

最大的问题是试图用预期的数据类型来堆积标题标签库。有标准定义的标签和供应商标签。 ruby-dicom文件包含一个文本格式的标签库,可以很容易地进行检查。

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

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

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

Python是可能比下这种风格的标题解析虽然一个更好的选择......