Como criar um perfil de anonimato DICOM personalizado a partir de CSV, JSON ou XML

Como criar um perfil de anonimato DICOM personalizado a partir de CSV, JSON ou XML

Este tutorial demonstra como criar perfis de anonimato personalizados DICOM usando arquivos CSV, JSON ou XML em C#. Profis customizados permitem que você define exatamente quais tags devem ser removidos, substituídos ou mantidos de acordo com as políticas específicas de privacidade da sua instituição.

Por que criar perfis personalizados?

Os perfis DICOM PS3.15 predefinidos podem não atender a todos os requisitos institucionais.

  • Manter identificadores institucionais específicos para a rastreabilidade interna
  • Aplica as regras de privacidade específicas da organização
  • Cumpre requisitos regulamentares únicos em sua jurisdição

Tag Ações explicadas

As seguintes ações podem ser aplicadas às tags DICOM:

AçãoCódigoDescrição
EliminaçãoDRemova o tag completamente do conjunto de dados
ZeroZSubstituir o valor por um valor vazio ou zero
RemoverXRemova se estiver presente (similar a Remover)
KeepKMantenha o valor original inalterado
CleanCLimpe o valor removendo informações de identificação
Substituição por UIDUSubstituir com um novo UID gerado

Título: Preparando o Meio Ambiente

  • Instale o Visual Studio ou qualquer .NET IDE compatível.
  • Crie um novo projeto de aplicação .NET 8 console.
  • Instale Aspose.Medical do NuGet Package Manager.
  • Prepare o seu arquivo de definição de perfil personalizado.

Guia passo a passo para criar perfis personalizados

Passo 1: Instalar Aspose.Medical

Adicione a Aspose.Medical Library ao seu projeto usando NuGet.

Install-Package Aspose.Medical

Passo 2: Crie uma definição de perfil CSV

Crie um arquivo CSV com padrões e ações de tag. Cada linha especifica uma tag e sua ação.

  • Página de 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=“Copia do código”

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

  • Nome e ID do paciente Zeros
  • Remova a data de nascimento
  • O sexo do paciente
  • Substitui Estudo, Série e SOP Instance UIDs
  • Eliminação de informações institucionais
  • Descrição do estudo Cleans

Passo 3: Crie uma definição de perfil JSON (Alternativa)

Crie um arquivo JSON com as mesmas definições de tag.

  • Página inicial .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: Crie uma definição de perfil XML (alternativa)

Crie um arquivo XML com as mesmas definições de tag.

  • 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: Carregar o perfil personalizado

Carregue o perfil personalizado usando o método apropriado para o seu formato de arquivo.

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: Aplique o perfil personalizado

Crie um Anonimizer com o perfil carregado e aplique-o aos arquivos 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");

Exemplo de código completo com perfil CSV

Aqui está um exemplo completo usando um perfil personalizado baseado em 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!");

Exemplos de cenário prático

Scenário 1: Retain Institution ID para rastreamento interno

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

Scenário 2: substituir todos os UIDs enquanto preservam relações

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

Cenário 3: Privacidade máxima para partilha 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

Validação: Testando seu perfil personalizado

Verifique sempre os perfis personalizados antes do uso da produção:

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

Caminho de arquivo inválido

Se o arquivo de perfil não for encontrado:

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

Invalid Tag Pattern ou Ação

Assegurar que os padrões de tag seguem o formato (GGGG,EEEE) onde o GGGG é o grupo e o EEEE é a parte em hexadecimal. ações válidas são: D, Z, X, K, C, U.

Melhores práticas para perfis personalizados

  • Controlar a versão: armazenar arquivos de perfil no controle da versão para rastrear mudanças ao longo do tempo.
  • Documentação: Adicione comentários que explicam por que ações específicas foram selecionadas para cada tag.
  • Testing: Valida os perfis com dados de teste antes de aplicar para a produção de arquivos DICOM.
  • Backup: Mantenha sempre backups dos arquivos de perfil originais.
  • Review: Revisão periódica dos perfis para garantir que ainda satisfaçam os requisitos regulamentares.

Informações adicionais

  • Considere a criação de múltiplos perfis para diferentes casos de uso (compartilhamento interno, pesquisa externa, etc.).
  • Documentos cujo perfil foi usado para anonimizar arquivos para fins de auditoria.
  • Os formatos JSON e XML oferecem uma melhor estrutura para perfis complexos com definições nestas.

Conclusão

Este tutorial demonstrou como criar perfis de anonimato personalizados DICOM usando arquivos CSV, JSON, ou XML em C# com Aspose.Medical.Profiles personalizadas fornecem a flexibilidade para implementar políticas de privacidade específicas da instituição ao mesmo tempo que mantêm o cumprimento com as regras de saúde.

 Português