2017-10-11 221 views
1

对于我的项目,我试图用VS-2015(.Net 4.5.2)中的fo-dicom 3.0.2和C#从DICOM文件中读取放射治疗计划(RT Plan)。如何使用fo-dicom从序列中读取嵌套/子DICOM标签?

由于DICOM编辑器,我知道存储在不同的DicomTags中的值,但我无法访问所有Tag s。例如,我试图读取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标签?

回答

3

您正在查找标签的方式只在DICOM标签树的最外层次结构中查找。要正确搜索标签,您需要首先访问正确的序列,然后选择适当的项目,然后搜索该项目中的标签。 DICOM数据集可能包含序列(由VR SQ标识),这些序列甚至可以进一步嵌套。

以下是从here复制:

的VR标识“SQ”应被用于数据元素与包括零个或多个项目的序列,其中,每个项目包含了一组数据元素中的一个值。 SQ提供了一种灵活的编码方案,可以用于重复数据元素集的简单结构,也可以用于更复杂的信息对象定义(通常称为文件夹)的编码。 SQ数据元素也可以递归地用于包含多级嵌套结构。

存在于SQ数据元素中的项目应该是一个有序集合,其中每个项目可以被其序号位置引用。每个项目应隐含地分配一个序号位置,序列中第一个项目的值为1,每个后续项目增加1。序列中的最后一个项目的顺序位置等于序列中的项目数量。

以下是从here复制:

DICOM允许数据集以包含其它嵌套的数据集,其被编码为“序列”。这种结构的重点在于允许重复数据组,因此虽然此类序列通常只包含一个数据集,但格式的定义使得每个序列由一组数据集组成。当然,这种结构非常适合递归,而一些DICOM IOD如Structured_Reporting和Radiotherapy_Extensions可以使用嵌套深度为5或6的序列!

序列的格式如下所示: Image


理论已经足够。以下是您如何序列内读取嵌套标签:

var value = file.Dataset.Get<DicomSequence>(DicomTag.FractionGroupSequence).Items[0].Get<string>(DicomTag.BeamDose); 

参考this线程的更多细节。

+0

感谢您的回答。这个解决方案非常好=) – Booma