我正在matlab中读取dicom文件并修改其一些数据,然后尝试将其保存到另一个文件中,但是这样做时,私有(private)dicom数据要么根本不写入(当“WritePrivate”设置为0时),要么以UINT8数组的形式编写,这变得令人费解且毫无用处。我什至尝试将从原始dicom文件中获取的数据复制到新结构并写入新的dicom文件,但是即使私有(private)数据在新结构中仍然可以使用,在新dicom文件中也不会保留。在不更改matlab dicom词典的情况下,有什么方法可以在复制到新的dicom文件时保持此私有(private)数据完整吗?

我提供了以下代码来显示我要执行的操作。

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中的数据不包含任何私有(private)数据。如果我将代码更改为以下内容
dicomwrite(X,'example.dcm',h,'CreateMode','copy','WritePrivate',1);

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

最佳答案

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

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

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

要编写私有(private)标签,您可以执行以下操作:
header.Private_0045_10xx_Creator = 'MY_PRIVATE_BLOCK';
header.Private_0045_1001 = int32(65535);

如果随后使用dicomwrite将其写出并使用hdr = dicominfo('mynewimg');读回,则可以看到它确实确实将值写为32位整数,即使不幸的是,即使总是将数据读入作为向量, uint8值。
>> hdr.Private_0045_1001

ans =

  255
  255
    0
    0

只要您知道期望的类型,您就应该能够在阅读 header 之后将数据类型转换回所需的类型。例如:
>> typecast(hdr.Private_0045_1001, 'int32')

ans =

   65535

关于matlab - 在不修改字典的情况下在matlab中写入Private Dicom数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13765510/

10-13 05:07