Come creare un profilo di anonimizzazione DICOM personalizzato da CSV, JSON o XML

Come creare un profilo di anonimizzazione DICOM personalizzato da CSV, JSON o XML

Questo tutorial dimostra come creare profili di anonimizzazione personalizzati DICOM utilizzando file CSV, JSON o XML in C#. Profili personalizzate ti consentono di definire esattamente quali etichette dovrebbero essere rimosse, sostituite o conservate secondo le specifiche politiche sulla privacy della tua istituzione.

Perché creare profili personalizzati?

I profili DICOM PS3.15 predefiniti potrebbero non soddisfare tutti i requisiti istituzionali.

  • Mantenere identificatori istituzionali specifici per la tracciabilità interna
  • Applicare le regole di privacy specifiche all’organizzazione
  • Rispondi ai requisiti normativi unici nella tua giurisdizione

Tag azioni spiegate

Le seguenti azioni possono essere applicate ai tag DICOM:

azioneCodiceDescrizione
RimuovereDRimuovere completamente il tag dal set di dati
zeroZsostituire il valore con un valore vuoto o zero
RimuovereXRimozione se presente (simile a Rimuovere)
KeepKMantenere il valore originale invariato
CleanCPulire il valore rimuovendo le informazioni di identificazione
Sostituzione con UIDUsostituire con un nuovo UID generato

Prerequisiti: preparare l’ambiente

  • Inserisci Visual Studio o qualsiasi compatibile .NET IDE.
  • Creare un nuovo progetto di applicazione .NET 8 console.
  • Installare Aspose.Medical dal NuGet Package Manager.
  • Preparare il file di definizione del profilo personalizzato.

Guida passo dopo passo per creare profili personalizzati

Passo 1: Installare Aspose.Medical

Aggiungi la biblioteca medica Aspose al tuo progetto utilizzando NuGet.

Install-Package Aspose.Medical

Passo 2: Creare una definizione del profilo CSV

Creare un file CSV con modelli e azioni tag. Ogni riga specifica un tag e la sua azione.

  • Il profilo di 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=“Copia il codice”

<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>

Questo profilo:

  • Nome e ID del paziente Zeros
  • Rimuovere la data di nascita
  • Il sesso del paziente
  • Sostituisce Studio, Serie e SOP Instance UID
  • Eliminare le informazioni istituzionali
  • Descrizione dello studio Cleans

Passo 3: Creare una definizione del profilo JSON (alternativa)

Creare un file JSON con le stesse definizioni tag.

  • Il profilo di 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" }
]

Passo 4: Creare una definizione del profilo XML (alternativa)

Creare un file XML con le stesse definizioni di tag.

  • Il profilo 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>

Passo 5: Caricare il profilo personalizzato

Caricare il profilo personalizzato utilizzando il metodo appropriato per il formato del file.

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
);

Passo 6: Applicare il profilo personalizzato

Creare un Anonymizer con il profilo caricato e applicarlo ai file 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");

Esempio di codice completo con il profilo CSV

Ecco un esempio completo utilizzando un profilo personalizzato basato su 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!");

Esempi di scenario pratico

Scenario 1: Retain ID dell’istituzione per il monitoraggio interno

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

Scenario 2: sostituire tutti gli UID durante la conservazione delle relazioni

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

Scenario 3: massima privacy per la condivisione esterna

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

Validazione: testare il tuo profilo personalizzato

Validare sempre i profili personalizzati prima dell’uso della produzione:

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

Invalid File Path

Se il file di profilo non può essere trovato:

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

Invalid Tag Pattern o azione

Assicurarsi che i modelli di tag seguano il formato (GGGG,EEEE) dove GGGG è il gruppo e EEEE è l’elemento in hexadecimal. azioni valide sono: D, Z, X, K, C, U.

Le migliori pratiche per i profili personalizzati

  • Controllare la versione: memorizzare i file di profilo nel controllo della versione per tracciare i cambiamenti nel tempo.
  • Documentazione: Aggiungi commenti che spiegano perché sono state selezionate azioni specifiche per ogni tag.
  • Testing: Validare i profili con i dati di prova prima di applicarsi alla produzione di file DICOM.
  • Backup: Mantenere sempre i backup dei file di profilo originali.
  • Review: Revisione periodica dei profili per garantire che soddisfino ancora i requisiti normativi.

Informazioni aggiuntive

  • Considerare la creazione di più profili per diversi casi di utilizzo (divisione interna, ricerca esterna, ecc.).
  • Documento che il profilo è stato utilizzato per anonimizzare i file per scopi di audit.
  • I formati JSON e XML offrono una migliore struttura per i profili complessi con definizioni nestate.

conclusione

Questo tutorial ha dimostrato come creare profili di anonimizzazione personalizzati DICOM utilizzando file CSV, JSON o XML in C# con Aspose.Medical. Profili personalizzate forniscono la flessibilità per implementare politiche di privacy specifiche all’istituzione, mantenendo al contempo il rispetto delle norme sanitarie.

 Italiano