Как создать персонализированный профиль анонимизации DICOM из CSV, JSON или XML

Как создать персонализированный профиль анонимизации DICOM из CSV, JSON или XML

Этот урок показывает, как создать персонализированные профили анонимности DICOM с использованием файлов CSV, JSON или XML в C#. Каждая профиль позволяет точно определить, какие теги следует удалить, заменить или сохранить в соответствии с конкретными политиками конфиденциальности вашей организации.

Зачем создавать персонализированные профили?

Предефинированные профили DICOM PS3.15 могут не соответствовать всем институциональным требованиям.

  • Сохранение конкретных институциональных идентификаторов для внутренней прослеживаемости
  • Применение организационно-специальных правил конфиденциальности
  • Соответствует уникальным нормативным требованиям в вашей юрисдикции

Tag Акции объяснены

Следующие действия могут применяться к тегам DICOM:

ДействиеКодописание
УдалитьDУдаление знака полностью из набора данных
0 нуляZЗаменить стоимость пустой или нулевой стоимостью
УдалениеXУдаление, если присутствует (подобно удалению)
KeepKСохранить оригинальную ценность неизменной
CleanCОчистить ценность путем удаления идентификационной информации
Заменить UIDUЗамена новым генерируемым УИД

Преимущества: Подготовка к окружающей среде

  • Настройка Visual Studio или любой совместимый .NET IDE.
  • Создайте новый проект приложения .NET 8 для консоли.
  • Инсталляция Aspose.Medical из NuGet Package Manager.
  • Подготовьте свой персонализированный файл определения профиля.

Step-by-Step Guide для создания персонализированных профилей

Шаг 1: Инсталляция Aspose.Medical

Добавьте в свой проект библиотеку Aspose.Medical с помощью NuGet.

Install-Package Aspose.Medical

Шаг 2: Создание определения профиля CSV

Создание CSV-файла с шаблонами и действиями. каждая линия указывает знак и его действие.

  • Профиль .csv :*
TagPattern;Action
(0010,0010);Z
(0010,0020);Z
(0010,0030);X
(0010,0040);K
(0020,000D);U
(0020,000E);U
(0008,0018);U
(0008,0080);D
(0008,0081);D
(0008,1030);C

<button class=“hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50” title=“Копирование кода”

<div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4"></div>
<div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4"></div>

Этот профиль:

  • Имя и идентификация пациента Zeros
  • Удаление даты рождения
  • Секс у пациентов
  • Замена студии, серии и SOP Instance UID
  • Изъятие институциональной информации
  • Чистый опис исследования

Шаг 3: Создание JSON Profile Definition (Alternative)

Создайте файл JSON с теми же обозначениями.

  • Профиль .json :*
[
  { "TagPattern": "(0010,0010)", "Action": "Z" },
  { "TagPattern": "(0010,0020)", "Action": "Z" },
  { "TagPattern": "(0010,0030)", "Action": "X" },
  { "TagPattern": "(0010,0040)", "Action": "K" },
  { "TagPattern": "(0020,000D)", "Action": "U" },
  { "TagPattern": "(0020,000E)", "Action": "U" },
  { "TagPattern": "(0008,0018)", "Action": "U" },
  { "TagPattern": "(0008,0080)", "Action": "D" },
  { "TagPattern": "(0008,0081)", "Action": "D" },
  { "TagPattern": "(0008,1030)", "Action": "C" }
]

Шаг 4: Создание определения профиля XML (альтернативный)

Создайте XML-файл с теми же обозначениями.

• Профиль xml: *

<?xml version="1.0" encoding="utf-8"?>
<ConfidentialityProfile>
  <TagAction TagPattern="(0010,0010)" Action="Z" />
  <TagAction TagPattern="(0010,0020)" Action="Z" />
  <TagAction TagPattern="(0010,0030)" Action="X" />
  <TagAction TagPattern="(0010,0040)" Action="K" />
  <TagAction TagPattern="(0020,000D)" Action="U" />
  <TagAction TagPattern="(0020,000E)" Action="U" />
  <TagAction TagPattern="(0008,0018)" Action="U" />
  <TagAction TagPattern="(0008,0080)" Action="D" />
  <TagAction TagPattern="(0008,0081)" Action="D" />
  <TagAction TagPattern="(0008,1030)" Action="C" />
</ConfidentialityProfile>

Шаг 5: Загрузите персонализированный профиль

Загрузите персонализированный профиль с помощью соответствующего метода для вашего формата файла.

using Aspose.Medical.Dicom.Anonymization;

// Load from CSV
ConfidentialityProfile profileFromCsv = ConfidentialityProfile.LoadFromCsvFile(
    "profile.csv", 
    ConfidentialityProfileOptions.All
);

// Or load from JSON
ConfidentialityProfile profileFromJson = ConfidentialityProfile.LoadFromJsonFile(
    "profile.json", 
    ConfidentialityProfileOptions.All
);

// Or load from XML
ConfidentialityProfile profileFromXml = ConfidentialityProfile.LoadFromXmlFile(
    "profile.xml", 
    ConfidentialityProfileOptions.All
);

Шаг 6: Применение персонализированного профиля

Создайте анонимизатор с загруженным профилем и нанесете его на файлы DICOM.

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;

// Load custom profile
ConfidentialityProfile profile = ConfidentialityProfile.LoadFromCsvFile(
    "profile.csv", 
    ConfidentialityProfileOptions.All
);

// Create anonymizer with custom profile
Anonymizer anonymizer = new(profile);

// Load and anonymize DICOM file
DicomFile dcm = DicomFile.Open("patient_study.dcm");
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
anonymizedDcm.Save("anonymized_study.dcm");

Полный пример кода с CSV-профилем

Вот полный пример с использованием персонализированного профиля на базе CSV:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;

// Load custom confidentiality profile from CSV
ConfidentialityProfile profile = ConfidentialityProfile.LoadFromCsvFile(
    "hospital_privacy_profile.csv",
    ConfidentialityProfileOptions.All
);

// Create anonymizer with the custom profile
Anonymizer anonymizer = new(profile);

// Load DICOM file
DicomFile dcm = DicomFile.Open("patient_scan.dcm");

// Anonymize using custom profile
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);

// Save result
anonymizedDcm.Save("anonymized_scan.dcm");

Console.WriteLine("Anonymization completed with custom profile!");

Примеры практического сценария

Сценарий 1: Идентификация института для внутреннего отслеживания

TagPattern;Action
(0010,0010);Z
(0010,0020);Z
(0008,0080);K
(0008,0081);K

Сценарий 2: Замена всех УИД во время сохранения отношений

TagPattern;Action
(0020,000D);U
(0020,000E);U
(0008,0018);U
(0008,0016);K

Сценарий 3: Максимальная конфиденциальность для внешнего распределения

TagPattern;Action
(0010,0010);X
(0010,0020);X
(0010,0030);X
(0010,0040);X
(0008,0080);X
(0008,0081);X
(0008,1030);X
(0008,103E);X

Валидация: тестирование вашего персонализированного профиля

Всегда проверяйте персонализированные профили перед использованием производства:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;

// Load custom profile
ConfidentialityProfile profile = ConfidentialityProfile.LoadFromCsvFile(
    "test_profile.csv",
    ConfidentialityProfileOptions.All
);

Anonymizer anonymizer = new(profile);

// Test with sample files
string[] testFiles = Directory.GetFiles("test_samples", "*.dcm");

foreach (string filePath in testFiles)
{
    try
    {
        DicomFile dcm = DicomFile.Open(filePath);
        DicomFile anonymized = anonymizer.Anonymize(dcm);
        
        string outputPath = Path.Combine("test_output", Path.GetFileName(filePath));
        anonymized.Save(outputPath);
        
        Console.WriteLine($"✓ Processed: {Path.GetFileName(filePath)}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"✗ Failed: {Path.GetFileName(filePath)} - {ex.Message}");
    }
}

Console.WriteLine("\nValidation complete. Review output files in DICOM viewer.");

Troubleshooting

Инвалид файловый путь

Если файл профиля не найден:

string profilePath = "profile.csv";
if (!File.Exists(profilePath))
{
    Console.WriteLine($"Profile file not found: {profilePath}");
    return;
}

Инвалидный шаблон или действие

Убедитесь, что шаблоны маркировки следуют формату (GGGG,EEEE) где GGGG является группой и EEEE является элементом в hexadecimal. валидными действиями являются: D, Z, X, K, C, U.

Лучшие практики для персонализированных профилей

  • Контроль версии: хранить файлы профиля в контроле версии для отслеживания изменений со временем.
  • Документация: Добавьте комментарии, объясняющие, почему для каждой теги были выбраны конкретные действия.
  • Тестирование: Проверьте профили с данными тестирования, прежде чем применять к производству файлов DICOM.
  • Backup: всегда сохраняйте резервные копии оригинальных файлов профиля.
  • Рецензия: периодически проверяют профили, чтобы убедиться, что они все еще соответствуют нормативным требованиям.

Дополнительная информация

  • Рассмотрим создание множественных профилей для различных случаев использования (внутреннее деление, внешние исследования и т.д.).
  • Документ, профиль которого использовался при анонимизации файлов в целях аудита.
  • JSON и XML-форматы предлагают лучшее строение для сложных профилей с настойчивыми определениями.

Заключение

Этот урок показал, как создать персонализированные профили анонимности DICOM с использованием CSV, JSON или XML файлов в C# с Aspose.Medical.

 Русский