一个非常简单的pydicom
示例涉及读取文件,然后输出Series Time
:
import pydicom
info = pydicom.dcmread("file.dcm")
print(info.SeriesTime)
因此对于已读取的对象,点表示法可以替代print(info[pydicom.tag.Tag((0x0008, 0x0031))])
或print(info[0x0008, 0x0031])
等更复杂的构造。很好。
现在,pydicom
仅支持读取一些标签以提高性能:
info = pydicom.dcmread("file.dcm", specific_tags=['SeriesTime', ])
我不喜欢在代码中使用字符串常量。那么在上面的示例中,'SeriesTime'
的可读替代品是什么? specific_tags=[pydicom.tag.Tag((0x0008, 0x0031)), ]
并不是特别可读。
理想情况下,我希望能够通过点表示法访问标记字典,例如pydicom.allTags.SeriesTime
,但我似乎找不到。
答案 0 :(得分:1)
您正在寻找的是数据字典。在Pydicom中,您可以在这里找到它:
pydicom.datadict.DicomDictionary
,但这是元组的决定,它实际上不适合通过点表示法进行访问。例如,要检索“ SeriesTime”,您将必须编写pydicom.datadict.DicomDictionary[524337][4]
,它既不可读也不保证在Pydicom更新时仍然有效(尽管我怀疑它是否会经常更改)。
您可以使用namedtuple自己实现此目的:
from collections import namedtuple
import pydicom
def get_dict_as_namedtuple(pdict):
# some keywords are empty, check for those
keywords_list = [pdict[i][4] for i in pdict if pdict[i][4].strip() != '']
Keywords = namedtuple('Keywords', keywords_list)
# unpack the list as positional arguments
return Keywords(*keywords_list)
dicom_tags = get_dict_as_namedtuple(pydicom.datadict.DicomDictionary)
print(dicom_tags.SeriesTime)
# prints 'SeriesTime'
或者是我最初不太优雅的解决方案(此解决方案无法使用标签自动完成功能):
(通过Fabric codebase找到的this answer中AttributeDict的示例代码)
import pydicom
class AttributeDict(dict):
def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
def __setattr__(self, key, value):
self[key] = value
def first(self, *names):
for name in names:
value = self.get(name)
if value:
return value
def get_data_dict(pydicom_data_dict):
data_dict = AttributeDict({})
for entry in pydicom_data_dict:
keyword = pydicom_data_dict[entry][4]
data_dict[keyword] = keyword
return data_dict
pydicom_data_dict = get_data_dict(pydicom.datadict.DicomDictionary)
print(pydicom_data_dict.SeriesTime)
#prints 'SeriesTime'
答案 1 :(得分:1)
这是获得pydicom词典的点对点访问的另一种相对简短的方法:
from pydicom.datadict import tag_for_keyword
from pydicom.tag import Tag
class DottedDcmDict(object):
def __getattr__(self, name):
tag = tag_for_keyword(name)
if tag:
return Tag(tag)
raise AttributeError("Not a valid DICOM identifier")
dd = DottedDcmDict()
print(dd.SeriesTime)
(0008, 0031)