Πώς να συλλέξετε ανώνυμο ένα φάκελο μελετών 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. Είτε επεξεργάζονται εκατοντάδες ή χιλιάδες αρχείων, η προσέγγιση συλλογής εξασφαλίζει συνεπή ανωνυμία σε όλο το σύνολο των δεδομένων σας, παρέχοντας παράλληλα την παρακολούθηση της προόδου και τη διαχείριση σφαλμάτων για την αξιοπιστία της παραγωγής.