5

我正在读取 matlab 中的 dicom 文件并修改其中的一些数据并尝试将其保存到另一个文件中,但是在这样做的同时,私有 dicom 数据要么根本不写入(当“WritePrivate”设置为 0 时)或者它是写成一个 UINT8 数组,变得难以理解和无用。我什至尝试将我从原始 dicom 文件中获取的数据复制到新结构并写入新的 dicom 文件,但即使私有数据在新结构中保持良好,它在新 dicom 文件中也不会保持不变。有没有办法在不更改 matlab dicom 字典的情况下复制到新的 dicom 文件时保持这些私有数据的完整性?

我提供了以下代码来显示我正在尝试做的事情。

X=dicomread('Bad011_4CH_01.dcm');
metadata = dicominfo('Bad011_4CH_01.dcm');
metadata.PatientName.FamilyName='LastName';
metadata.PatientName.GivenName='FirstName';
birthday=metadata.PatientBirthDate;
year=birthday(1,1:4);
newyear=strcat(year,'0101');
metadata.PatientBirthDate=newyear;
names=fieldnames(metadata);

h=metadata;

dicomwrite(X,'example.dcm',h,'CreateMode','copy');

newh=dicominfo('example.dcm');

这里 newh 中的数据不包含任何私有数据。如果我将代码更改为以下

dicomwrite(X,'example.dcm',h,'CreateMode','copy','WritePrivate',1);

在这种情况下,私有数据被完全更改为一些 UIN8 数组并且无用。我的任务的理想解决方案是在不更改 matlab dicom 字典的情况下将私有数据保留在新创建的 dicom 文件中。

4

2 回答 2

1

您是否尝试过类似的方法:

dicomwrite(uint16(image), fileName, 'ObjectType', 'MR Image Storage', ...
    'WritePrivate', true, header);

其中“header”是由名称-值对组成的结构,其格式与您从 MATLAB 的 dicominfo 函数获得的标头数据相同?我在 MATLAB 中创建图像的一般方法是避免使用 CreateMode 'copy',而是通过显式复制有意义的属性来构建我自己的 DICOM 标头,并为应该具有新值的属性生成我自己的值。

要编写私有标签,您可以执行以下操作:

header.Private_0045_10xx_Creator = 'MY_PRIVATE_BLOCK';
header.Private_0045_1001 = int32(65535);

如果您随后使用 dicomwrite 将其写出并在 using 中读回hdr = dicominfo('mynewimg');,您会看到它确实将值写入为 32 位整数,尽管不幸的是,if 总是将数据作为 uint8 的向量入价值观。

>> hdr.Private_0045_1001

ans =

  255
  255
    0
    0

只要您知道预期的类型,您就应该能够在阅读标题后将数据类型转换回所需的类型。例如:

>> typecast(hdr.Private_0045_1001, 'int32')

ans =

   65535
于 2012-12-13T22:38:20.757 回答
1

我知道我迟到了大约 8 年,但你有没有试过

dicomwrite(..., 'VR', 'explicit')

?

它为我解决了“读取为 uint8”的问题。

编辑:

实际上,您似乎需要使用该标签的 VR 指定一个 dicom 字典。如果你把它和'VR'、'explicit'结合起来,那么读取dicom的程序就不需要字典文件了。

于 2020-06-09T13:51:44.093 回答