چگونگی جمع آوری یک پوشه از مطالعات DICOM

چگونگی جمع آوری یک پوشه از مطالعات DICOM

این راهنمای نشان می دهد که چگونه برای جمع آوری چندین فایل DICOM از یک پوشه با استفاده از C#. هنگامی که با صدها یا هزاران فایل تصویر پزشکی کار می کند، پردازش مجموعه برای بهره وری و سازگاری ضروری است.

مزایای استفاده از Batch Anonymization

  • بهره وری:- تمام مطالعات یا آرشیوها را در یک عملیات انجام دهید.

  • آموزش متناسب:- همان قوانین ناشناس سازی را برای تمام فایل ها اعمال کنید.

  • اتوماسیون:- یکپارچه سازی در جریان های کار و لوله های اتوماتیک

برچسب ها: آماده سازی محیط زیست

  • Visual Studio یا هر IDE .NET سازگار را نصب کنید.
  • ایجاد یک برنامه جدید .NET 8 کنسول.
  • نصب Aspose.Medical از NuGet Package Manager.
  • فاکتور ورودی را با فایل های DICOM آماده کنید و یک پوشه خروجی ایجاد کنید.

راهنمای گام به گام برای جمع آوری فایل های DICOM ناشناس

مرحله اول: نصب Aspose.Medical

کتابخانه Aspose.Medical را به پروژه خود با استفاده از NuGet اضافه کنید.

Install-Package Aspose.Medical

مرحله دوم: فضای نام مورد نیاز را شامل کنید

ارجاعات را به فضاهای نام مورد نیاز در کد خود اضافه کنید.

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);

مرحله چهارم: فهرست فایل های DICOM

دریافت تمام فایل های DICOM از دایرکتوری ورودی، از جمله فرعی.

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

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

مرحله پنجم: ایجاد ناشناس

یک مثال ناشناس را با پروفایل مورد نظر خود ایجاد کنید.

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 Anonymization

در اینجا یک نمونه کامل از نشان دادن ناشناس شدن مجموعه با گزارش پیشرفت است:

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}");
    }
}

نسخه پیشرفته با Logging

برای محیط های تولید، سوابق مناسب را اجرا کنید:

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}");

بهترین روش های پردازش باتچ

  • نمایش روی کپی داده ها: همیشه یک نسخه از داده های اصلی شما را پردازش می کند، نه خود اصلی ها.
  • Log All Operations: ذخیره سوابق دقیق از فایل های پردازش شده و هر گونه خطا روبرو شده است.
  • Test First: قبل از پردازش کل مجموعه داده، بر روی یک نمونه کوچک اجرا کنید.
  • ** فضای دیسک مانیتور**: فضای کافی برای فایل های خروجی را فراهم می کند.
  • توقف های معامله: در نظر داشته باشید که برای بسته های بسیار بزرگ، عملکرد نقطه بررسی / بازخورد را اجرا کنید.

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. چه پردازش صدها یا هزاران فایل، رویکرد مجموعه تضمین ناشناس یکپارچه در سراسر مجموعه داده خود را در حالی که ارائه ردیابی پیشرفت و مدیریت خطا برای قابلیت اطمینان تولید.

 فارسی