Πώς να συλλέξετε ανώνυμο ένα φάκελο μελετών DICOM

Πώς να συλλέξετε ανώνυμο ένα φάκελο μελετών DICOM

Αυτό το εγχειρίδιο δείχνει πώς να συσχετίσετε ανώνυμα πολλαπλά αρχεία DICOM από ένα φάκελο χρησιμοποιώντας C#. Όταν εργάζεστε με εκατοντάδες ή χιλιάδες ιατρικές αρχές εικόνας, η επεξεργασία συσκευών είναι απαραίτητη για την αποτελεσματικότητα και τη συνοχή.

Πλεονεκτήματα της ανωνυμοποίησης Batch

  • Αποτελεσματικότητα:- Επεξεργασία ολόκληρων ερευνών ή αρχείων σε μια ενιαία λειτουργία.

  • Συνοχή:- Εφαρμόστε τους ίδιους κανόνες ανωνυμοποίησης σε όλα τα αρχεία.

  • ΑΥΤΟΜΑΤΙΣΜΟΣ:- Ενσωμάτωση σε αυτόματες ροές εργασίας και σωλήνες.

Προϋποθέσεις: Προετοιμασία του περιβάλλοντος

  • Εγκαταστήστε το Visual Studio ή οποιοδήποτε συμβατό .NET IDE.
  • Δημιουργήστε ένα νέο πρόγραμμα εφαρμογής .NET 8 console.
  • Εγκαταστήστε το Aspose.Medical από το NuGet Package Manager.
  • Προετοιμάστε το φάκελο εισόδου με τα αρχεία DICOM και δημιουργήστε ένα φακέλο εξόδου.

Βήμα προς βήμα Οδηγός για την ανωνυμοποίηση των αρχείων DICOM

Βήμα 1: Εγκατάσταση Aspose.Medical

Προσθήκη της βιβλιοθήκης Aspose.Medical στο έργο σας χρησιμοποιώντας το NuGet.

Install-Package Aspose.Medical

Βήμα 2: Συμπληρώστε τις απαραίτητες ονομαστικές περιοχές

Προσθέστε αναφορές στις απαιτούμενες ονομαστικές περιοχές στον κώδικα σας.

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

Βήμα 3: Ρυθμίστε τα μονοπάτια της διεύθυνσης

Προσδιορίστε τις διαδρομές εισόδου και εξόδου σας.

string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";

// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);

Βήμα 4: Καταχωρήστε τα αρχεία DICOM

Αποκτήστε όλα τα αρχεία DICOM από τη διεύθυνση εισόδου, συμπεριλαμβανομένων των υποδιευθύνσεων.

string[] dicomFiles = Directory.GetFiles(
    inputDirectory, 
    "*.dcm", 
    SearchOption.AllDirectories
);

Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");

Βήμα 5: Δημιουργήστε το Anonymizer

Δημιουργήστε μια περίπτωση Anonymizer με το επιθυμητό προφίλ σας.

Anonymizer anonymizer = new();
// Or with a custom profile:
// ConfidentialityProfile profile = ConfidentialityProfile.CreateDefault(
//     ConfidentialityProfileOptions.BasicProfile
// );
// Anonymizer anonymizer = new(profile);

Βήμα 6: Επεξεργασία κάθε αρχείου

Περπατήστε μέσα από κάθε αρχείο, το ανώνυμο και αποθηκεύστε στο εγχειρίδιο εξόδου.

int successCount = 0;
int failCount = 0;

foreach (string filePath in dicomFiles)
{
    try
    {
        // Load DICOM file
        DicomFile dcm = DicomFile.Open(filePath);
        
        // Anonymize
        DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
        
        // Preserve relative directory structure
        string relativePath = Path.GetRelativePath(inputDirectory, filePath);
        string outputPath = Path.Combine(outputDirectory, relativePath);
        
        // Ensure subdirectory exists
        Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
        
        // Save anonymized file
        anonymizedDcm.Save(outputPath);
        
        successCount++;
        Console.WriteLine($"✓ Processed: {relativePath}");
    }
    catch (Exception ex)
    {
        failCount++;
        Console.WriteLine($"✗ Failed: {filePath} - {ex.Message}");
    }
}

Console.WriteLine($"\nCompleted: {successCount} succeeded, {failCount} failed.");

Το πλήρες παράδειγμα κώδικα για την ανωνυμοποίηση του Batch

Εδώ είναι ένα πλήρες παράδειγμα που αποδεικνύει την ανωνυμοποίηση των τμημάτων με την αναφορά προόδου:

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

string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";

// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);

// Get all DICOM files
string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.\n");

// Create anonymizer
Anonymizer anonymizer = new();

int successCount = 0;
int failCount = 0;
int total = dicomFiles.Length;

foreach (string filePath in dicomFiles)
{
    try
    {
        DicomFile dcm = DicomFile.Open(filePath);
        DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
        
        string relativePath = Path.GetRelativePath(inputDirectory, filePath);
        string outputPath = Path.Combine(outputDirectory, relativePath);
        Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
        
        anonymizedDcm.Save(outputPath);
        successCount++;
        
        // Progress reporting
        double progress = (double)(successCount + failCount) / total * 100;
        Console.WriteLine($"[{progress:F1}%] ✓ {relativePath}");
    }
    catch (Exception ex)
    {
        failCount++;
        Console.WriteLine($"✗ Failed: {Path.GetFileName(filePath)} - {ex.Message}");
    }
}

Console.WriteLine($"\n========================================");
Console.WriteLine($"Batch Anonymization Complete");
Console.WriteLine($"Succeeded: {successCount}");
Console.WriteLine($"Failed: {failCount}");
Console.WriteLine($"========================================");

Παράλληλη επεξεργασία για καλύτερη απόδοση

Για μεγάλες συσκευές δεδομένων, χρησιμοποιήστε παράλληλη επεξεργασία για να εκμεταλλευτείτε πολλαπλούς πυρήνες CPU:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
using System.Collections.Concurrent;

string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";

Directory.CreateDirectory(outputDirectory);

string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.\n");

// Thread-safe counters
int successCount = 0;
int failCount = 0;
ConcurrentBag<string> failedFiles = new();

// Process in parallel
Parallel.ForEach(dicomFiles, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, filePath =>
{
    try
    {
        // Each thread gets its own anonymizer instance
        Anonymizer anonymizer = new();
        
        DicomFile dcm = DicomFile.Open(filePath);
        DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
        
        string relativePath = Path.GetRelativePath(inputDirectory, filePath);
        string outputPath = Path.Combine(outputDirectory, relativePath);
        
        lock (outputDirectory) // Ensure directory creation is thread-safe
        {
            Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
        }
        
        anonymizedDcm.Save(outputPath);
        Interlocked.Increment(ref successCount);
    }
    catch (Exception ex)
    {
        Interlocked.Increment(ref failCount);
        failedFiles.Add($"{filePath}: {ex.Message}");
    }
});

Console.WriteLine($"\nBatch Anonymization Complete");
Console.WriteLine($"Succeeded: {successCount}");
Console.WriteLine($"Failed: {failCount}");

if (failedFiles.Any())
{
    Console.WriteLine($"\nFailed files:");
    foreach (string failure in failedFiles)
    {
        Console.WriteLine($"  - {failure}");
    }
}

Βελτιωμένη έκδοση με σύνδεση

Για το περιβάλλον παραγωγής, εφαρμόστε την κατάλληλη καταγραφή:

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

string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
string logFile = Path.Combine(outputDirectory, "anonymization_log.txt");

Directory.CreateDirectory(outputDirectory);

string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);

Anonymizer anonymizer = new();
List<string> logEntries = new();

logEntries.Add($"Anonymization started: {DateTime.Now}");
logEntries.Add($"Input directory: {inputDirectory}");
logEntries.Add($"Output directory: {outputDirectory}");
logEntries.Add($"Total files to process: {dicomFiles.Length}");
logEntries.Add("---");

int successCount = 0;
int failCount = 0;

foreach (string filePath in dicomFiles)
{
    string relativePath = Path.GetRelativePath(inputDirectory, filePath);
    
    try
    {
        DicomFile dcm = DicomFile.Open(filePath);
        DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
        
        string outputPath = Path.Combine(outputDirectory, relativePath);
        Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
        anonymizedDcm.Save(outputPath);
        
        successCount++;
        logEntries.Add($"SUCCESS: {relativePath}");
    }
    catch (Exception ex)
    {
        failCount++;
        logEntries.Add($"FAILED: {relativePath} - {ex.Message}");
    }
}

logEntries.Add("---");
logEntries.Add($"Anonymization completed: {DateTime.Now}");
logEntries.Add($"Succeeded: {successCount}");
logEntries.Add($"Failed: {failCount}");

// Write log file
File.WriteAllLines(logFile, logEntries);

Console.WriteLine($"Processing complete. Log saved to: {logFile}");

Οι καλύτερες πρακτικές για την επεξεργασία Batch

  • Δραστηριότητες για την αντιγραφή των δεδομένων: Πάντα επεξεργάζεστε ένα αντίγραφο των αρχικών στοιχείων σας, όχι τα ίδια τα αρχικά.
  • Log All Operations: Διατηρήστε λεπτομερείς καταλόγους των οποίων τα αρχεία επεξεργάζονται και οποιαδήποτε σφάλματα συναντώνται.
  • Test First: Δοκιμάστε ένα μικρό δείγμα πριν επεξεργαστείτε ολόκληρο το σύνολο δεδομένων.
  • Monitor Disk Space: Εξασφαλίζει επαρκή χώρο δίσκου για τα αρχεία εκκίνησης.
  • Απαγόρευση των συναλλαγών: Σκεφτείτε την εφαρμογή της λειτουργικότητας checkpoint/resume για πολύ μεγάλες συσκευές.

Troubleshooting

Προβλήματα μνήμης με μεγάλα δεδομένα

Για πολύ μεγάλα αρχεία ή σύνολα δεδομένων, επεξεργασία αρχείων μία φορά χωρίς να κρατάτε αναφορές:

foreach (string filePath in dicomFiles)
{
    using (DicomFile dcm = DicomFile.Open(filePath))
    {
        DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
        anonymizedDcm.Save(outputPath);
    }
    // Files are disposed after each iteration
}

Λάθος αδειοδότησης

Βεβαιωθείτε ότι η εφαρμογή σας έχει διαβάσει την πρόσβαση στο κατάλογο εισαγωγών και γράψτε την προσβασιμότητα στο εγχειρίδιο εξόδου.

Συμπεράσματα

Αυτό το εγχειρίδιο έχει δείξει πώς να συσκευάσετε ανώνυμα αρχεία DICOM στο C# χρησιμοποιώντας Aspose.Medical. Είτε επεξεργάζονται εκατοντάδες ή χιλιάδες αρχείων, η προσέγγιση συλλογής εξασφαλίζει συνεπή ανωνυμία σε όλο το σύνολο των δεδομένων σας, παρέχοντας παράλληλα την παρακολούθηση της προόδου και τη διαχείριση σφαλμάτων για την αξιοπιστία της παραγωγής.

 Ελληνικά