DICOM çalışmaları bir klasörü anonimleştirmek için nasıl
Bu öğretici, C# kullanarak bir klasörden birden fazla DICOM dosyasını anonimleştirmenin yollarını gösterir. yüzlerce veya binlerce tıbbi görüntü dosyası ile çalışırken, paket işleme verimlilik ve tutarlılık için gereklidir.
Batch Anonimleştirme Faydaları
Verimlilik:- Tüm çalışmaları veya arşivleri tek bir operasyonda işlemek.
Koordinasyon:- Tüm dosyalar için aynı anonim kuralları uygulayın.
Otomatik:- Otomatik çalışma akışlarına ve borularına entegre olun.
Etiket Arşivi: çevreyi hazırlamak
- Visual Studio veya herhangi bir uyumlu .NET IDE ayarlayın.
- Yeni bir .NET 8 konsol uygulama projesi oluşturun.
- Aspose.Medical’ı NuGet Paket Yöneticisi’nden kurun.
- Giriş klasörünü DICOM dosyaları ile hazırlayın ve bir çıkış klasörü oluşturun.
DICOM dosyalarını anonimleştirmek için adım adım rehber
Adım 1: Aspose.Medical yükleme
Projenize Aspose.Medical kütüphanesini NuGet kullanarak ekleyin.
Install-Package Aspose.Medical2. Adım: İhtiyacınız olan alanları içerir
Kodunuzda gerekli isim alanlarına referanslar ekleyin.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;3. Adım: Directory yollarını ayarlayın
Giriş ve çıkış dizin yollarını belirleyin.
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);Adım 4: DICOM dosyalarını listeleyin
Tüm DICOM dosyalarını giriş dizininden alın, alt adresler de dahil olmak üzere.
string[] dicomFiles = Directory.GetFiles(
inputDirectory,
"*.dcm",
SearchOption.AllDirectories
);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");5. Adım: Anonim oluşturun
İstediğiniz profilinizle bir Anonymizer örneği oluşturun.
Anonymizer anonymizer = new();
// Or with a custom profile:
// ConfidentialityProfile profile = ConfidentialityProfile.CreateDefault(
// ConfidentialityProfileOptions.BasicProfile
// );
// Anonymizer anonymizer = new(profile);Adım 6: Her dosyayı işleme
Her dosyayı geçin, anonimleştirin ve çıkış dizinine kaydedin.
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 Anonimleştirme için Tam Kodu Örneği
İşte ilerleme raporlaması ile batch anonimliğini gösteren tam bir örnek:
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($"========================================");Daha iyi performans için paralel işleme
Büyük veri kümeleri için, birden fazla CPU çekirdeği kullanmak için paralel işleme kullanın:
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}");
}
}Logging ile geliştirilmiş versiyonu
Üretim ortamları için, doğru logging uygulanır:
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 İşleme için En İyi Uygulamalar
- Data Kopyası üzerinde çalışın: Her zaman orijinal verilerinizin bir kopyasını işlemeyin.
- Log Tüm İşlemler: Hangi dosyaların işlenmiş ve herhangi bir hata karşılaştığı ayrıntılı günlükleri tutun.
- Test First: Tüm veri kümesini işlemeye başlamadan önce küçük bir örnek üzerinde çalışın.
- Monitor Disk Space: çıkış dosyaları için yeterli disk alanı sağlar.
- Handle Interruptions: Çok büyük paketler için kontrol noktası/resume işlevselliğini uygulamayı düşünün.
Troubleshooting
Büyük veri kümeleri ile hafıza sorunları
Çok büyük dosyalar veya veri kümeleri için, referansları tutmadan dosyaları tek seferde işler:
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
}izin hataları
Uygulamanızın giriş dizinine erişimi okuduğundan ve çıkış dizini yazdığından emin olun.
Sonuç
Bu öğretici, Aspose.Medical kullanılarak C#‘da DICOM dosyalarını anonimleştirme yöntemini göstermiştir. yüzlerce veya binlerce dosya işleme olup olmadığına bakılmaksızın, paket yaklaşımı, tüm veritabanız boyunca tutarlı bir anonimizasyon sağlar ve aynı zamanda ilerleme izleme ve üretim güvenilirliği için hata işlemini sağlayacaktır.