Hogyan készítsünk egy DICOM tanulmányok mappáját
Ez a kézikönyv azt mutatja, hogyan lehet anonimizálni a több DICOM fájlokat egy C#-t használó mappából. Amikor több száz vagy több ezer orvosi képfájlt dolgozunk, a csomagkezelés elengedhetetlen a hatékonyság és a következetesség szempontjából.
A Batch Anonymizáció előnyei
Hatékonyság:- A teljes tanulmányok vagy archívumok egyetlen műveletben történő feldolgozása.
A következetesség:- Ugyanazokat az anonimizációs szabályokat alkalmazza az összes fájlra.
Az automatizálás:- Integráljon automatizált munkafolyamatokba és csővezetékekbe.
Előfeltételek: a környezet előkészítése
- A Visual Studio vagy bármely kompatibilis .NET IDE beállítása.
- Hozzon létre egy új .NET 8 konzol alkalmazási projektet.
- Telepítse az Aspose.Medical-t a NuGet csomagkezelőből.
- Készítsen beviteli mappát a DICOM fájlokkal, és hozzon létre egy kimeneti foldert.
Lépésről lépésre útmutató a DICOM fájlok anonimizálására
1. lépés: Install Aspose.Medical
Add hozzá az Aspose.Medical könyvtárat a projekthez a NuGet használatával.
Install-Package Aspose.Medical2. lépés: Tartalmazza a szükséges névterületeket
Hozzáadjon hivatkozásokat a szükséges névterületekhez a kódjában.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;3. lépés: Állítsa be a katalógus útvonalát
Határozza meg a be- és kimeneti címkével kapcsolatos útvonalakat.
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);4. lépés: A DICOM fájlok listája
Szerezze meg az összes DICOM fájlt a beviteli kézikönyvből, beleértve a mellékhelyeket is.
string[] dicomFiles = Directory.GetFiles(
inputDirectory,
"*.dcm",
SearchOption.AllDirectories
);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");5. lépés: Hozza létre az Anonymizálót
Hozzon létre egy Anonymizáló példát a kívánt profiljával.
Anonymizer anonymizer = new();
// Or with a custom profile:
// ConfidentialityProfile profile = ConfidentialityProfile.CreateDefault(
// ConfidentialityProfileOptions.BasicProfile
// );
// Anonymizer anonymizer = new(profile);6. lépés: Minden fájl feldolgozása
Menj át minden fájlt, anonimizálja, és mentse a kimeneti kézikönyv.
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.");Teljes kódmintája a Batch Anonymizáláshoz
Íme egy teljes példa, amely demonstrálja az anonimizációt a haladásról szóló jelentéssel:
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($"========================================");párhuzamos feldolgozás a jobb teljesítmény érdekében
Nagy adatkészletek esetében használjon párhuzamos feldolgozást a több CPU-kór használatához:
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}");
}
}Továbbfejlesztett verzió logging
A termelési környezetekhez a megfelelő naplózás végrehajtása:
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}");A legjobb gyakorlatok a batch feldolgozáshoz
- Adatok másolása: Az eredeti adatok mindig másolatát feldolgozza, nem pedig az eredeti adatokat.
- Log All Operations: Tartsa a feldolgozott fájlok részletes logjait és bármilyen hibát.
- Test First: A teljes adatkészlet feldolgozását megelőzően egy kis mintán fut.
- Monitor Disk Space: Megfelelő lemezterületet biztosít a kimeneti fájlokhoz.
- Handle Interruptions: Figyelembe kell venni a checkpoint/resume funkciók végrehajtását nagyon nagy darabokra.
Troubleshooting
Memória problémák nagy adatkészülékekkel
A nagyon nagy fájlok vagy adatkészletek esetében a Fájlokat egyszerre feldolgozzuk anélkül, hogy referenciákat tartanánk:
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
}Engedély hibák
Győződjön meg róla, hogy az alkalmazás olvassa el a beviteli kézikönyvhez való hozzáférést, és írja be a kimeneti címkét.
következtetések
Ez a kézikönyv megmutatta, hogyan lehet csomagolni anonim DICOM fájlokat C# használatával Aspose.Medical. függetlenül attól, hogy feldolgozása több száz vagy több ezren, a csomagolási megközelítés biztosítja a következetes anonimizáció az egész adatkészletet, miközben előrelépés nyomon követése és hiba kezelése a termelés megbízhatóságát.