dicom头个人信息转换为.txt文件

dicom header personal information conversion to a .txt file

我有一系列要匿名化的 DICOM 图像,我发现很少有 Matlab 代码和一些程序可以完成这项工作,但其中 none 导出一个包含已删除个人信息的 .txt 文件。我想知道是否有一种功能可以将 DICOM 图像的已删除个人信息保存为 .txt 格式以供功能使用。另外,我正在尝试创建一个 table,它显示相应的新图像 ID 到他们的真实姓名。(主题真实姓名 = 个人信息删除图像 ID)

有什么想法吗?

感谢您考虑我的请求!

实现此目的的一种方法是在匿名化之前和之后存储标签,并使用它们来编写您的文本文件。在 Matlab 中,dicominfo() 会将标签读取到一个结构中:

% Get tags before anonymization
tags_before = dicominfo(file_in);

% Anoymize
dicomanon(file_in, file_out); % Need to set tags values where required

% Get tags after anonymization
tags_after = dicominfo(file_out);

% Do something with the two structures
disp(['Patient ID:', tags_before.PatientID ' -> ' tags_after.PatientID]);
disp(['Date of Birth:', tags_before.PatientBirthDate ' -> ' tags_after.PatientBirthDate]);
disp(['Family Name:', tags_before.PatientName.FamilyName ' -> ' tags_after.PatientName.FamilyName]);

然后您可以将 before/after 字段写入文本文件。您需要修改 dicomanon() 以便为删除的字段选择您自己的值,因为默认情况下它们设置为空。

我猜您只想将更改 的字段输出到您的文本文件 anonymization (either modified, removed, or added). First, you may want to modify some dicomanon 选项以减少更改次数,特别是通过参数 'WritePrivate', true 以确保保留私有扩展。

首先,您可以使用 dicominfo:

执行匿名化,保存前和 post-匿名化元数据的结构
preAnonData = dicominfo('input_file.dcm');
dicomanon('input_file.dcm', 'output_file.dcm', 'WritePrivate', true);
postAnonData = dicominfo('output_file.dcm');

然后可以使用fieldnames and setdiff找到匿名化删除或添加的字段,将它们分别添加到post-匿名化或前匿名化数据中,带有nan 值作为占位符:

preFields = fieldnames(preAnonData);
postFields = fieldnames(postAnonData);

removedFields = setdiff(preFields, postFields);
for iField = 1:numel(removedFields)
  postAnonData.(removedFields{iField}) = nan;
end

addedFields = setdiff(postFields, preFields);
for iField = 1:numel(addedFields)
  preAnonData.(addedFields{iField}) = nan;
end

使用 orderfields 也将很有帮助,这样两个数据结构的字段名称具有相同的顺序:

postAnonData = orderfields(postAnonData, preAnonData);

最后,既然每个结构都有相同顺序的相同字段,我们可以使用 struct2cell to convert their field data to a cell array and use cellfun and isequal 来查找任何已被匿名化修改的字段:

allFields = fieldnames(preAnonData);
preAnonCell = struct2cell(preAnonData);
postAnonCell = struct2cell(postAnonData);
index = ~cellfun(@isequal, preAnonCell, postAnonCell);
modFields = allFields(index);

现在您可以像这样创建一个 table 更改:

T = table(modFields, preAnonCell(index), postAnonCell(index), ...
          'VariableNames', {'Field', 'PreAnon', 'PostAnon'});

并且您可以使用 writetable 轻松地将 table 数据输出到文本文件:

writetable(T, 'anonymized_data.txt');

但是请注意,如果 table 中的任何字段包含向量或数据结构,输出文件的格式可能看起来有点古怪(即很多列,其中大部分是空的,除了那几个字段)。