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

时间:2017-06-07 04:35:31

标签: matlab dicom

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

有什么想法吗?

感谢您考虑我的要求!

2 个答案:

答案 0 :(得分:1)

我猜您只想在anonymization(修改,删除或添加)更改的字段输出到您的文本文件。首先,您可能希望修改一些dicomanon选项以减少更改次数,特别是传递参数'WritePrivate', true以确保保留私有扩展。

首先,您可以使用dicominfo执行匿名化,保存匿名化前后的元数据结构:

preAnonData = dicominfo('input_file.dcm');
dicomanon('input_file.dcm', 'output_file.dcm', 'WritePrivate', true);
postAnonData = dicominfo('output_file.dcm');

然后,您可以使用fieldnamessetdiff查找通过匿名删除或添加的字段,并将它们分别添加到匿名后匿名或匿名前数据中,{{1作为占位符的值:

nan

使用orderfields也会有所帮助,以便两个数据结构的字段名称具有相同的顺序:

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

最后,既然每个结构都以相同的顺序具有相同的字段,我们可以使用struct2cell将其字段数据转换为单元格数组,并使用cellfunisequal查找任何字段已被匿名修改的字段:

postAnonData = orderfields(postAnonData, preAnonData);

现在您可以创建table更改,如下所示:

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

您可以使用writetable轻松地将表格数据输出到文本文件中:

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

但请注意,如果表中的任何字段包含数据的向量或结构,则输出文件的格式可能看起来有点时髦(即大量列,其中大多数都是空的,除了那些少数字段)。

答案 1 :(得分:0)

执行此操作的一种方法是在匿名化之前和之后存储标记,并使用这些标记来编写文本文件。在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]);

然后,您可以将之前/之后的字段写入文本文件。您需要修改dicomanon()为已删除的字段选择自己的值,因为默认设置为空。