解析DICOM文件的最简单,最pythonic的方法是什么?
不使用非Python库的本机Python实现将是更受欢迎的。 DICOM是数字医疗成像中的标准文件格式(有关更多信息,请查看here)。
有一些C / C ++库支持读取(子集)DICOM文件。其中两个或三个甚至都有Python绑定。本机Python解析器对我来说有两个目的:
答案 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开发:
它支持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)
答案 8 :(得分:0)
我想知道原始海报尝试了什么以及哪些方法有效并且不适用于他。我从未使用过DICOM,但快速谷歌搜索“DICOM python”给了几个有趣的结果。似乎这个项目:http://www.creatis.univ-lyon1.fr/Public/Gdcm/应该提供你想要的东西。它有python绑定和非常活跃的邮件列表。