我有一系列DICOM图像,我想要匿名,我发现很少有Matlab代码和一些程序可以完成这项工作,但它们都没有导出.txt文件中删除的个人信息。我想知道是否有一个功能,它还可以保存删除的.txt格式的DICOM图像的个人信息,用于功能用途。此外,我正在尝试创建一个表格,显示相应的新图像ID到他们的真实姓名。(主题真实姓名=个人信息删除图像ID)
有什么想法吗?
感谢您考虑我的要求!
答案 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');
然后,您可以使用fieldnames
和setdiff
查找通过匿名删除或添加的字段,并将它们分别添加到匿名后匿名或匿名前数据中,{{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
将其字段数据转换为单元格数组,并使用cellfun
和isequal
查找任何字段已被匿名修改的字段:
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()
为已删除的字段选择自己的值,因为默认设置为空。