对于我的项目,我试图从一个包含fo-dicom 3.0.2和C# in VS2015 (.Net 4.5.2)的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标记?
发布于 2017-10-11 14:22:36
您查找标记的方式只在DICOM标记树的最外层层次中查找。要正确搜索标记,您需要先访问正确的序列,然后访问适当的项,然后搜索该项中的标记。DICOM数据集可能包含序列(由VR、SQ识别),这些序列甚至可能被进一步嵌套。
下面是从这里复制的
VR标识的"SQ“应用于数值由零个或多个项目组成的数据元素,其中每个项目包含一组数据元素。SQ提供了一种灵活的编码方案,可用于重复数据元素的简单结构,也可用于对更复杂的信息对象定义(通常称为文件夹)的编码。SQ数据元素也可以递归地用于包含多层嵌套结构。 SQ数据元素中的项目应是有序集合,其中每一项可按其序号位置引用。每一项应隐式地分配序号位置,从序列中第一项的值1开始,并随其后的每一项增加1。序列中的最后一项的序号位置应等于序列中的项目数。
下面是从这里复制的
DICOM允许数据集包含其他嵌套数据集,这些数据集被编码为“序列”。这种结构的目的是允许重复的数据组,因此虽然这些序列通常只包含单个数据集,但是格式的定义使得每个序列都由一组数据集组成。当然,这种结构非常适合递归,一些DICOM IODs,比如Structured_Reporting和Radiotherapy_Extensions,可以使用嵌套5或6深的序列! 序列的格式如下所示:[

理论够多了。以下是如何读取序列中的嵌套标记:
var value = file.Dataset.Get<DicomSequence>(DicomTag.FractionGroupSequence).Items[0].Get<string>(DicomTag.BeamDose);有关详细信息,请参阅这线程。
https://stackoverflow.com/questions/46690392
复制相似问题