解析DICOM文件的最简单,最pythonic的方法是什么?
不使用非Python库的本机Python实现将是更受欢迎的.DICOM是数字医疗成像中的标准文件格式(有关更多信息,请查看此处).
有一些C/C++库支持读取(子集)DICOM文件.其中两个或三个甚至都有Python绑定.本机Python解析器可以为我提供两个目的:
无需构建任何外部C/C++库.
了解DICOM文件格式.
MvdD.. 21
截至今天,还有另一个纯Python包可以读取DICOM文件:pydicom
截至今天,还有另一个纯Python包可以读取DICOM文件:pydicom
这些天我大量使用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格式,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,至少在最初阶段.它更容易混淆而不是启发.全局了解更为重要.一旦你掌握了全局,那么你就可以陷入微妙之中.
上面提到的库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数据应该非常相似.