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 中的任何字段包含向量或数据结构,输出文件的格式可能看起来有点古怪(即很多列,其中大部分是空的,除了那几个字段)。
我有一系列要匿名化的 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
:
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 中的任何字段包含向量或数据结构,输出文件的格式可能看起来有点古怪(即很多列,其中大部分是空的,除了那几个字段)。