Làm thế nào để Batch Anonymous một Folder của DICOM Nghiên cứu
Hướng dẫn này cho thấy làm thế nào để nhúng vô danh nhiều tập tin DICOM từ một thư mục bằng cách sử dụng C#. Khi làm việc với hàng trăm hoặc hàng ngàn tệp hình ảnh y tế, bộ xử lý là cần thiết cho hiệu quả và sự nhất quán.
Lợi ích của Batch Anonymization
Hiệu quả:- Thực hiện toàn bộ các nghiên cứu hoặc lưu trữ trong một hoạt động.
Sự liên tục:- Hãy áp dụng các quy tắc ẩn danh tương tự cho tất cả các tệp.
Tự động hóa:- Tích hợp vào các dòng công việc tự động và ống.
Chủ đề: Chuẩn bị môi trường
- Cài đặt Visual Studio hoặc bất kỳ IDE .NET tương thích nào.
- Tạo một dự án ứng dụng .NET 8 mới.
- Cài đặt Aspose.Medical từ NuGet Package Manager.
- Chuẩn bị thư mục nhập với các tệp DICOM và tạo một folder output.
Hướng dẫn từng bước để Batch Anonymize DICOM File
Bước 1: Cài đặt Aspose.Medical
Thêm thư viện Aspose.Medical vào dự án của bạn bằng NuGet.
Install-Package Aspose.MedicalBước 2: Thêm các không gian tên cần thiết
Thêm tham chiếu đến các không gian tên cần thiết trong mã của bạn.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;Bước 3: Thiết lập đường hướng dẫn
Thiết lập các con đường thư mục input và output của bạn.
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);Bước 4: Danh sách các tập tin DICOM
Nhận tất cả các tệp DICOM từ danh mục nhập, bao gồm các thư mục phụ.
string[] dicomFiles = Directory.GetFiles(
inputDirectory,
"*.dcm",
SearchOption.AllDirectories
);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");Bước 5: Tạo Anonymizer
Tạo một ví dụ Anonymizer với hồ sơ mong muốn của bạn.
Anonymizer anonymizer = new();
// Or with a custom profile:
// ConfidentialityProfile profile = ConfidentialityProfile.CreateDefault(
// ConfidentialityProfileOptions.BasicProfile
// );
// Anonymizer anonymizer = new(profile);Bước 6: Xử lý mỗi tập tin
Đi qua mỗi tệp, vô danh nó, và lưu vào thư mục xuất.
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.");Mẫu mã đầy đủ cho Batch Anonymization
Dưới đây là một ví dụ đầy đủ để chứng minh sự vô danh của nhóm với báo cáo tiến bộ:
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($"========================================");Hợp đồng xử lý cho hiệu suất tốt hơn
Đối với các tập dữ liệu lớn, sử dụng xử lý song song để khai thác nhiều cột 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}");
}
}Phiên bản nâng cao với Logging
Đối với môi trường sản xuất, thực hiện logging thích hợp:
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}");Thực hành tốt nhất cho Batch Processing
- Hành động trên sao chép dữ liệu: Luôn xử lý một bản sao của thông tin ban đầu của bạn, chứ không phải bản gốc.
- Log All Operations: Giữ hồ sơ chi tiết về các tệp đã được xử lý và bất kỳ lỗi nào xảy ra.
- Test First: chạy trên một mẫu nhỏ trước khi xử lý toàn bộ bộ dữ liệu.
- Monitor Disk Space: Bảo đảm đủ không gian đĩa cho các tệp xuất.
- **Hãy xem xét việc thực hiện chức năng checkpoint/resume cho các gói rất lớn.
Troubleshooting
Vấn đề bộ nhớ với dữ liệu lớn
Đối với các tệp rất lớn hoặc các tập tin dữ liệu, xử lý file một lần mà không lưu trữ tham chiếu:
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
}Lỗi cho phép
Hãy chắc chắn rằng ứng dụng của bạn đã đọc truy cập vào thư mục nhập và viết truy nhập vào danh mục output.
Kết luận
Hướng dẫn này đã chứng minh làm thế nào để thu thập các tập tin DICOM trong C# bằng cách sử dụng Aspose.Medical. Cho dù xử lý hàng trăm hoặc hàng ngàn tệp, cách tiếp cận thu được đảm bảo nhận dạng liên tục trên toàn bộ bộ dữ liệu của bạn trong khi cung cấp theo dõi tiến bộ và quản lý lỗi cho độ tin cậy sản xuất.