Comment créer un profil d'anonymisation DICOM personnalisé à partir de CSV, JSON ou XML

Comment créer un profil d'anonymisation DICOM personnalisé à partir de CSV, JSON ou XML

Ce tutoriel montre comment créer des profils d’anonymisation personnalisés DICOM en utilisant des fichiers CSV, JSON ou XML en C#. Les profiles personnalizés vous permettent de définir exactement quels tags doivent être supprimés, remplacés ou conservés selon les politiques de confidentialité spécifiques de votre institution.

Pourquoi créer des profils personnalisés ?

Les profils DICOM PS3.15 prédéfinis peuvent ne pas répondre à toutes les exigences institutionnelles.

  • Retenir des identifiants institutionnels spécifiques pour la traçabilité interne
  • Appliquer les règles de confidentialité spécifiques à l’organisation
  • Respecter les exigences réglementaires uniques dans votre juridiction

Les actions expliquées

Les actions suivantes peuvent être appliquées aux tags DICOM:

ActionCodeDescription
SupprimerDSupprimer complètement l’étiquette des données
zeroZRemplacer la valeur par une valeur vide ou zéro
SupprimerXSupprimer si présent (comme supprimé)
KeepKConserver la valeur originale inchangée
CleanCNettoyer la valeur en supprimant les informations d’identification
Remplacer par UIDURemplacer par un nouveau UID généré

Étiquette : Préparer l’environnement

  • Configurez Visual Studio ou tout IDE .NET compatible.
  • Créer un nouveau projet d’application pour la console .NET 8.
  • Installez Aspose.Medical à partir du NuGet Package Manager.
  • Préparez votre fichier de définition de profil personnalisé.

Guide pas à pas pour créer des profils personnalisés

Étape 1 : Installer Aspose.Medical

Ajoutez la bibliothèque Aspose.Medical à votre projet en utilisant NuGet.

Install-Package Aspose.Medical

Étape 2 : Créer un profil CSV

Créez un fichier CSV avec des modèles et des actions de tag. Chaque ligne spécifie un tag et son action.

  • Profile.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=“Copier le code”

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

Ce profil :

  • Nom et identifiant du patient Zeros
  • Supprimer la date de naissance
  • Le sexe patient
  • Remplacer l’étude, la série et le SOP Instance UID
  • Supprimer les informations institutionnelles
  • Description de l’étude de Cleans

Étape 3 : Créer une définition de profil JSON (alternative)

Créer un fichier JSON avec les mêmes définitions de tag.

  • Profile.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" }
]

Étape 4 : Créer une définition de profil XML (alternative)

Créer un fichier XML avec les mêmes définitions de tag.

  • Le profil 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>

Étape 5: Téléchargez le profil personnalisé

Téléchargez le profil personnalisé en utilisant la méthode appropriée pour votre format de fichier.

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

Étape 6 : Appliquer le profil personnalisé

Créez un Anonymiser avec le profil chargé et appliquez-le aux fichiers 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");

Exemple de code complet avec le profil CSV

Voici un exemple complet utilisant un profil personnalisé basé sur 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!");

Exemples de scénarios pratiques

Scénario 1: Retain Institution ID pour le suivi interne

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

Scénario 2: Remplacer tous les UID pendant la préservation des relations

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

Scénario 3: Confidentialité maximale pour la partage extérieur

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

Validation : tester votre profil personnalisé

Valider toujours les profils personnalisés avant l’utilisation de la production:

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

Path de fichier invalide

Si le fichier de profil ne peut pas être trouvé :

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

Invalid Tag Pattern ou Action

Assurez-vous que les étiquettes suivent le format (GGGG,EEEE) où GGGG est le groupe et EEEE est l’élément en hexadecimal. Les actions valides sont: D, Z, X, K, C, U.

Les meilleures pratiques pour les profils personnalisés

  • Contrôle de version: stockez les fichiers de profil dans le contrôle de la version pour suivre les changements au fil du temps.
  • Documentation: Ajouter des commentaires expliquant pourquoi des actions spécifiques ont été sélectionnées pour chaque tag.
  • Testation: Valider les profils avec les données de test avant d’appliquer à la production des fichiers DICOM.
  • Backup: Gardez toujours des sauvegardes des fichiers de profil originaux.
  • Review: Revue périodique des profils pour s’assurer qu’ils remplissent toujours les exigences réglementaires.

Informations supplémentaires

  • Considérer la création de multiples profils pour différents cas d’utilisation (partage interne, recherche externe, etc.).
  • Document dont le profil a été utilisé lors de l’anonymisation des fichiers à des fins d’audit.
  • Les formats JSON et XML offrent une meilleure structure pour les profils complexes avec des définitions nés.

Conclusion

Ce tutoriel a démontré comment créer des profils d’anonymisation personnalisés DICOM en utilisant des fichiers CSV, JSON ou XML en C# avec Aspose.Medical.Profils personnalizés fournissent la flexibilité pour mettre en œuvre des politiques de confidentialité spécifiques à l’institution tout en conservant le respect des règlements sanitaires.

 Français