将结构写入 DICOM header
Write a struct into a DICOM header
我创建了一个私有 DICOM 标签,我想知道是否可以使用此标签使用 dicomwrite(或类似工具)将结构存储在 DICOM 文件中,而不是在 DICOM 中创建一个字段 header 每个结构字段。
(类似于保存患者姓名,但我不使用字符数据,而是使用双精度数据)
这是一个例子:
headerdicom = dicominfo('Test.dcm');
a.a = 1; a.b = 2; a.c = 3;
headerdicom.Private_0011_10xx_Creator = a;
img = dicomread('Test.dcm');
dicomwrite(img, 'test_modif.dcm', 'ObjectType', 'MR Image Storage', 'WritePrivate', true, headerdicom)
Undefined function 'fieldnames' for input arguments of type 'double'.
提前谢谢大家,
根据 "struct" 的含义,以下是您的选择。由于您想使用私人标签,这意味着没有应用程序但您的应用程序能够解释它,您可以选择技术上最合适的解决方案。基本上你的问题是 "which Value Representation should I assign to my private attribute using the DICOM toolkit of my choice?":
序列:
有一个 DICOM 值表示 "Sequence" (VR=SQ),它允许您存储不同类型的属性列表。这个 VR 最接近结构。一个序列可以包含任意数量的项目,每个项目都具有相同顺序的相同属性。每个属性都可以有自己的 VR,所以如果你的结构包含不同的数据类型(如字符串、整数、浮点数),这将是我的建议
多值属性:
DICOM 支持 "Value Multiplicity" 的概念。这意味着单个属性可以包含多个值,这些值由反斜杠分隔。由于 VR 是属性的 属性,因此所有值必须具有相同的类型。如果我理解正确的话,你有一个浮点数列表,可以在一个字段中用 VR=FD (=Floating Point Double) 编码为双精度数组:0.001[=56=].003 .234...
大多数工具包都支持对属性进行索引访问。
"Blob":
您可以使用 VR=OB(其他字节)的属性,该属性也用于对像素数据进行编码。它最多可以包含 4 GB 的二进制数据。属性的长度告诉您属性值包含多少字节。如果您只想将内存从 / 复制到结构,这将是可行的方法,但显然它是类型安全性和编码正确性方面最薄弱的方法。您将失去确保这些属性的 DICOM 工具包的内置方法。
要添加私有属性,您必须
为属性保留范围,指定奇数组编号和元素编号的前缀(2 个十六进制数字)。 (例如 group = 0x0011,Element = 0x10xx)保留从 (0x0011, 0x10xx) - (0x0011, 0x10ff) 的范围。这是通过指定一个包含制造商名称的私人创作者 DICOM 标签来完成的。所以我怀疑不是
headerdicom.Private_0011_10xx_Creator = a;
它应该读作例如
headerdicom.Private_0011_10xx_Creator = "Gabs";
- 在私人词典中注册您的私人标签,大部分时间是通过指定私人创作者、组、元素和 VR(上述选项之一)
不确定如何在 matlab 中完成此操作。
我创建了一个私有 DICOM 标签,我想知道是否可以使用此标签使用 dicomwrite(或类似工具)将结构存储在 DICOM 文件中,而不是在 DICOM 中创建一个字段 header 每个结构字段。
(类似于保存患者姓名,但我不使用字符数据,而是使用双精度数据)
这是一个例子:
headerdicom = dicominfo('Test.dcm');
a.a = 1; a.b = 2; a.c = 3;
headerdicom.Private_0011_10xx_Creator = a;
img = dicomread('Test.dcm');
dicomwrite(img, 'test_modif.dcm', 'ObjectType', 'MR Image Storage', 'WritePrivate', true, headerdicom)
Undefined function 'fieldnames' for input arguments of type 'double'.
提前谢谢大家,
根据 "struct" 的含义,以下是您的选择。由于您想使用私人标签,这意味着没有应用程序但您的应用程序能够解释它,您可以选择技术上最合适的解决方案。基本上你的问题是 "which Value Representation should I assign to my private attribute using the DICOM toolkit of my choice?":
序列: 有一个 DICOM 值表示 "Sequence" (VR=SQ),它允许您存储不同类型的属性列表。这个 VR 最接近结构。一个序列可以包含任意数量的项目,每个项目都具有相同顺序的相同属性。每个属性都可以有自己的 VR,所以如果你的结构包含不同的数据类型(如字符串、整数、浮点数),这将是我的建议
多值属性: DICOM 支持 "Value Multiplicity" 的概念。这意味着单个属性可以包含多个值,这些值由反斜杠分隔。由于 VR 是属性的 属性,因此所有值必须具有相同的类型。如果我理解正确的话,你有一个浮点数列表,可以在一个字段中用 VR=FD (=Floating Point Double) 编码为双精度数组:0.001[=56=].003 .234... 大多数工具包都支持对属性进行索引访问。
"Blob": 您可以使用 VR=OB(其他字节)的属性,该属性也用于对像素数据进行编码。它最多可以包含 4 GB 的二进制数据。属性的长度告诉您属性值包含多少字节。如果您只想将内存从 / 复制到结构,这将是可行的方法,但显然它是类型安全性和编码正确性方面最薄弱的方法。您将失去确保这些属性的 DICOM 工具包的内置方法。
要添加私有属性,您必须
为属性保留范围,指定奇数组编号和元素编号的前缀(2 个十六进制数字)。 (例如 group = 0x0011,Element = 0x10xx)保留从 (0x0011, 0x10xx) - (0x0011, 0x10ff) 的范围。这是通过指定一个包含制造商名称的私人创作者 DICOM 标签来完成的。所以我怀疑不是
headerdicom.Private_0011_10xx_Creator = a;
它应该读作例如
headerdicom.Private_0011_10xx_Creator = "Gabs";
- 在私人词典中注册您的私人标签,大部分时间是通过指定私人创作者、组、元素和 VR(上述选项之一)
不确定如何在 matlab 中完成此操作。