对于我的项目,我试图在VS2015(.Net 4.5.2)中使用fo-dicom 3.0.2和C#从DICOM文件中读取放射治疗计划(RT计划)。
感谢DICOM编辑器,我知道存储在不同DicomTags
中的值,但我无法访问所有Tag
。例如,我试图阅读DicomTag.BeamDose
,我知道价值不是空的。
string storedfile = file_path + file_name;
Dicom.DicomFile file = Dicom.DicomFile.Open(@storedfile);
MessageBox.Show(file.Dataset.Get<string>(Dicom.DicomTag.BeamDose));
运行代码会抛出一条带有消息的异常:
在数据集中找不到(300a,0084)。
如上所述,我知道它存在,但嵌套在序列中的序列项中。
接下来我尝试的是分析存储BeamDose
的序列。
var NewDataSet = file.Dataset.Get<Dicom.DicomItem>(Dicom.DicomTag.FractionGroupSequence);
但是,处理这个变量的每一个机会都没有把我带到序列的下一个层次。
如何使用fo-dicom从序列中读取嵌套/子DICOM标记?
答案 0 :(得分:5)
您查找标记的方式仅在DICOM标记树的最外层次结构中查找。要正确搜索标记,您需要先访问正确的序列,然后再访问相应的项目,然后搜索该项目中的标记。 DICOM数据集可能包含序列(由VR SQ标识),甚至可以进一步嵌套。
从here复制以下内容:
VR确定了&#34; SQ&#34;应用于具有由零个或多个项目的序列组成的值的数据元素,其中每个项目包含一组数据元素。 SQ提供了一种灵活的编码方案,可用于重复数据元素集的简单结构,或者用于通常称为文件夹的更复杂信息对象定义的编码。 SQ数据元素也可以递归使用,以包含多级嵌套结构。
SQ数据元素中存在的项目应为有序集合,其中每个项目可由其序号位置引用。每个项目应隐式分配一个序号位置,从序列中第一个项目的值1开始,并随后的每个项目递增1。序列中的最后一项应具有等于序列中项目数的序数位置。
从here复制以下内容:
DICOM允许数据集包含其他嵌套数据集,这些数据集编码为&#34;序列&#34;。该结构的要点是允许重复数据组,因此虽然这样的序列通常仅包含单个数据集,但是定义格式使得每个序列由一组数据集组成。当然,这种结构非常适合递归,而一些DICOM IOD如Structured_Reporting和Radiotherapy_Extensions可以使用嵌套5或6深的序列!
序列的格式如下所示: [
足够的理论。以下是如何读取序列中的嵌套标记:
var value = file.Dataset.Get<DicomSequence>(DicomTag.FractionGroupSequence).Items[0].Get<string>(DicomTag.BeamDose);
有关详细信息,请参阅this主题。