什么是解析DICOM文件的最简单和最Python的方式?了本机Python解析DICOM文件
不使用非Python库的原生Python实现会更喜欢。 DICOM是数字医学成像中的标准文件格式(有关更多信息,请参阅here)。
存在支持的DICOM文件中读取(子集)的一些C/C++库。其中两三个甚至有Python绑定。一个本地的Python解析器将为我提供两个目的:
- 无需构建任何外部C/C++库。
- 了解DICOM文件格式。
什么是解析DICOM文件的最简单和最Python的方式?了本机Python解析DICOM文件
不使用非Python库的原生Python实现会更喜欢。 DICOM是数字医学成像中的标准文件格式(有关更多信息,请参阅here)。
存在支持的DICOM文件中读取(子集)的一些C/C++库。其中两三个甚至有Python绑定。一个本地的Python解析器将为我提供两个目的:
而作为今天的还有另一个可用的纯Python包阅读DICOM文件:pydicom
我不知道楼主尝试和方法的工作,而不是为他工作。我从来没有与DICOM合作过,但是对“DICOM python”的快速搜索给出了一些有趣的结果。看来这个项目:http://www.creatis.univ-lyon1.fr/Public/Gdcm/应该提供你想要的。它有python绑定和一个相当活跃的邮件列表。
这两个链接都显得烂烂 – 2018-01-26 20:57:47
几年前,我一直在寻找同样的东西,发现这个: Python DICOM lib
我没有与代码太深刻的印象,但它是原生的Python读物DICOM文件。
如果您想了解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,至少在最初阶段。它更容易混淆而不是开导。获得大局面更重要。一旦你有了大局,那么你可以下降到微妙的地步。
较新的gdcm发展到现在发生在这里:
它支持在Python之上的Java和C#。
为什么写又一 DICOM实现时,你可以集中一个C++实现,也有它接触到这么多不同的语言
上面提到的似乎是用于访问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数据应该非常相似。
这几天我大量使用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格式的信息是打开相似的文件并根据各个方面编写代码来进行比较:研究描述,窗口宽度和中心,像素表示等等。
玩得开心! :)
DICOM是一个真正的痛苦......即使制造商坚持标准。如果您编写自己的DICOM库,您会发现不同的制造商DICOM与其他供应商实际上不兼容[需要的引证]。
我尝试了(在我的空闲时间)编写一个C语言的dicom解析器,借用了一个很好的Ruby解析器,我狡猾地称为'ruby-dicom'。它实际上是非常易读的代码(我查看了一个较小的早期版本)。
最大的问题是试图用预期的数据类型来堆积标题标签库。有标准定义的标签和供应商标签。 ruby-dicom文件包含一个文本格式的标签库,可以很容易地进行检查。
我放弃了官方文献,因为我只对文件格式感兴趣,似乎只是在10个左右的PDF文件中的一个。
我的本地DICOM文件没有压缩,并遵循标准的易于编码的位排列,但是准备好用于存储在8位容器中的各种压缩和奇怪的12位图像,并且有大或小的字节顺序和没有填充位。
一旦时间变得非常稀少,我放弃了。
Python是可能比下这种风格的标题解析虽然一个更好的选择......
这是一个问题,“请为我做我的功课”? – 2008-09-23 10:00:16
不,恕我直言,我做了我的功课:有一些C/C++库支持DICOM文件的阅读(一个子集)。其中两三个甚至有Python绑定。 本地Python解析器对我来说有两个目的: 1.无需构建任何C/C++库。 2.了解DICOM文件格式。 – 2008-09-23 12:38:01