【问题标题】:Fo-dicom: How to add "empty, if unknown" integer string type 2 attributeFo-dicom:如何添加“空,如果未知”整数字符串类型 2 属性
【发布时间】:2022-05-27 00:35:57
【问题描述】:

有一个类型为 2 的标签(“必需,如果未知则为空”),其值表示为 Integer String,我想将其留空。我试过像这样创建属性:

var attribute = new DicomIntegerString(DicomTag.SeriesNumber, string.Empty);

文件的存储工作。当我再次读取文件时,以下调用的结果返回null

var result = dicomDataset.GetString(DicomTag.SeriesNumber); // <-- this is null

如何将元素设置为正确的“零长度”或“空,如果未知”?

谢谢。

【问题讨论】:

  • 如何添加属性 - 使用 AddOrUpdate?您是否检查过标签是用 DICOM 标签查看器编写的?另外:您使用的是哪个版本的 fo-dicom?
  • 感谢你的回复。我只使用DicomDataset 构造函数。我现在检查了dcmdump,并且实际上正在写入标签,并且“没有可用的值”。评论。难道是 fo-dicoms 检索值的方法无法区分“未找到该标签的值”和“找到标签,但值为空”?我正在使用版本5.0.2
  • 是的,我想是的,必须检查。据我记得,如果找不到标签,就会引发异常。返回null 或空标签的空字符串是一个设计决策,因为不存在的值和空值之间没有语义差异(我记得在 pydicom 中进行了类似的讨论),并且应该由客户端以相同的方式处理- 虽然我同意返回一个空字符串对于字符串标签会更方便。
  • 确认这是该行为。正如我所写的,在 DICOM 中,没有值的标记和具有空值的标记之间实际上没有区别(至少对于字符串标记而言),因此在这种情况下由库决定返回什么。作为用户,您可以将 null 值作为字符串标签的空字符串处理。

标签: dicom fo-dicom


【解决方案1】:

正如 cmets 中已经提到的,在数据​​集中设置空字符串的代码是正确的:

dataset.AddOrUpdate(new DicomIntegerString(DicomTag.SeriesNumber, string.Empty));

请注意,您还可以编写 null 值:

dataset.AddOrUpdate(new DicomIntegerString(DicomTag.SeriesNumber, (string)null));

写出数据集将为SeriesNumber 创建一个空标签,这两种情况下的方式完全相同,因为这两种情况在 DICOM 中是等价的。

读取标签的代码也是正确的,它返回 null 的事实是由于这种等价性,这在 DICOM 中对空字符串标签的解释产生了歧义。由于 DICOM 字符串标签中值的数量仅由字符串本身(以及它包含的反斜杠的数量)定义,因此没有值的标签之间没有区别(通常由 null 值表示),和一个带有空字符串的标签(将由 "" 值表示)。为了与其他标签保持一致,为带有 VM 0 的标签返回 null 是有意义的——对于非字符串 VR,这里没有歧义,因为定义了值的长度。对于字符串值,返回一个空字符串也是有意义的——这两种方法都有利有弊,所以最终它是库创建者的设计决定。

fo-dicom 中,最好同时处理这两种情况(例如使用string.IsNullOrEmpty 之类的东西)。如果您从文件数据集中读取值,您总是会得到null,但如果您将空字符串写入数据集中的标签(如上所示的第一个版本)并将其读回,您将得到相同的空字符串.

顺便说一句:在pydicom(通用 Python DICOM 库)中,有一个关于相同设计决策的discussion,最后添加了一个定义行为的配置条目(例如,返回 None 或空字符串对于这样的值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多