1

对于我的项目,我正在尝试在 VS2015(.Net 4.5.2)中使用 fo-dicom 3.0.2 和 C# 从 DICOM 文件中读取放射治疗计划(RT 计划)。

感谢 DICOM 编辑器,我知道存储在 different 中的值DicomTags,但我无法访问Tag我试图读取的所有 segDicomTag.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 标签?

4

1 回答 1

6

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

以下是从这里复制的:

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

SQ 数据元素中出现的项目应是一个有序集合,其中每个项目都可以通过其序号位置来引用。每个项目都应隐含地分配一个序号位置,从序列中的第一个项目的值 1 开始,并随着每个后续项目递增 1。序列中的最后一个项目的序号位置应等于序列中项目的数量。

以下是从这里复制的:

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

序列的格式如下所示:[图片][3]


理论够了。以下是如何读取序列中的嵌套标签:

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

有关更多详细信息,请参阅线程。

于 2017-10-11T14:22:36.380 回答