Cómo crear un perfil de anonimización personalizado de DICOM desde CSV, JSON o XML

Cómo crear un perfil de anonimización personalizado de DICOM desde CSV, JSON o XML

Este tutorial demuestra cómo crear perfiles de anonimato personalizados DICOM utilizando archivos CSV, JSON o XML en C#. Los perfís personalizado le permiten definir exactamente qué etiquetas deben ser eliminadas, reemplazadas o conservadas de acuerdo con las políticas de privacidad específicas de su institución.

¿Por qué crear perfiles personalizados?

Los perfiles DICOM PS3.15 predefinidos pueden no cumplir con todos los requisitos institucionales.

  • Mantener identificadores institucionales específicos para la rastreabilidad interna
  • Aplicación de reglas de privacidad específicas de la organización
  • Cumplir los requisitos regulatorios únicos en su jurisdicción

Las acciones explicadas

Las siguientes acciones se pueden aplicar a las etiquetas DICOM:

AcciónCódigoDescripción
EliminarDEliminar la etiqueta completamente del conjunto de datos
CeroZSubstituir el valor por un valor vacío o cero.
EliminarXRemover si está presente (similar a Eliminar)
KeepKPreserva el valor original sin cambios
CleanCLimpiar el valor eliminando la información de identificación
Substituir con UIDUSubstituir con un nuevo UID generado

Requisitos: Preparación del medio ambiente

  • Instalar Visual Studio o cualquier compatible .NET IDE.
  • Crea un nuevo proyecto de aplicación .NET 8 consola.
  • Instalar Aspose.Medical desde el NuGet Package Manager.
  • Prepara tu perfil de definición personalizado.

Guía paso a paso para crear perfiles personalizados

Paso 1: Instalar Aspose.Medical

Añade la biblioteca de Aspose.Medical a su proyecto utilizando NuGet.

Install-Package Aspose.Medical

Paso 2: Creación de una definición de perfil CSV

Crea un archivo CSV con patrones de etiquetas y acciones. Cada línea especifica una etiqueta y su acción.

  • El perfil.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=“Código de copia”

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

Este perfil:

  • Nombre y ID del paciente de Zeros
  • Elimina la fecha de nacimiento
  • El sexo de los pacientes
  • Reemplaza los UIDs de estudio, serie y instancia SOP
  • Elimina la información de la institución
  • Descripción del estudio de limpieza

Paso 3: Crea una definición de perfil JSON (alternativa)

Crea un archivo JSON con las mismas definiciones de etiquetas.

  • El perfil de 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" }
]

Paso 4: Crea una definición de perfil XML (alternativa)

Crea un archivo XML con las mismas definiciones de etiquetas.

*Profil.xml de la página: *

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

Paso 5: Cargar el perfil personalizado

Cargue el perfil personalizado utilizando el método adecuado para su formato de archivo.

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

Paso 6: Aplique el perfil personalizado

Crea un Anonymizador con el perfil cargado y aplique a los archivos 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");

Exemplos de código completos con el perfil CSV

Aquí hay un ejemplo completo utilizando un perfil personalizado basado en 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!");

Ejemplos de escenario práctico

Escenario 1: Retain Institution ID para el seguimiento interno

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

Escenario 2: Substituir todos los UID mientras mantiene relaciones

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

Escenario 3: Máxima privacidad para la distribución externa

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

Validación: Testando su perfil personalizado

Siempre valide los perfiles personalizados antes del uso de la producción:

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

Paseo de archivo Invalido

Si el archivo de perfil no se encuentra:

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

Invalid Tag Pattern o Acción

Asegurar que los patrones de etiquetas sigan el formato (GGGG,EEEE) donde el GGGG es el grupo y el EEEE el elemento en hexadecimal. acciones válidas son: D, Z, X, K, C, U.

Mejores prácticas para perfiles personalizados

  • Control de versión: almacenar archivos de perfil en el control de la versión para rastrear los cambios a lo largo del tiempo.
  • Documentación: Añade comentarios explicando por qué se seleccionaron acciones específicas para cada etiqueta.
  • Testing: Validar los perfiles con los datos de prueba antes de aplicarse a la producción de archivos DICOM.
  • Backup: siempre guardar backups de los archivos de perfil originales.
  • Review: Revisar periódicamente los perfiles para asegurarse de que todavía cumplen con los requisitos regulatorios.

Información adicional

  • Considere la creación de múltiples perfiles para diferentes casos de uso (división interna, investigación externa, etc.).
  • Documento cuyo perfil se utilizó al anonimizar los archivos para fines de auditoría.
  • Los formatos JSON y XML ofrecen una mejor estructura para los perfiles complejos con definiciones nestas.

Conclusión

Este tutorial ha demostrado cómo crear perfiles de anonimización personalizados DICOM utilizando los archivos CSV, JSON o XML en C# con Aspose.Medical.Los profiles personalizado proporcionan la flexibilidad para implementar políticas de privacidad específicas de la institución mientras mantienen el cumplimiento de las regulaciones sanitarias.

 Español