デコム研究のフォルダーを匿名化する方法
デコム研究のフォルダーを匿名化する方法
このチュートリアルは、C#を使用したフォルダーから複数のDICOMファイルを匿名化する方法を示しています 医療イメージファイルの数百または数千で作業するとき、バッチ処理は効率性と一貫性のために不可欠です。
バッチ匿名化の利点
効率性:- 全ての研究やアーカイブを一つの操作で処理します。
一貫性:- すべてのファイルに同じ匿名化ルールを適用します。
自動化:- 自動作業流やパイプラインに統合します。
原題: Preparing the Environment
- Visual Studio または 互換性のある .NET IDE を設定します.
- 新しい .NET 8 コンソールアプリケーションプロジェクトを作成します。
- NuGet Package Manager から Aspose.Medical をインストールします。
- 入力フォルダーを DICOM ファイルで準備し、出力を作成します。
ステップアップ バッチ 匿名化 DICOM ファイルのガイド
ステップ1:インストール Aspose.Medical
NuGet を使用してプロジェクトに Aspose.Medical ライブラリを追加します。
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 = 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.");バッチ匿名化のための完全なコード例
以下は、進歩報告とバッチ匿名化を示す完全な例です:
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}");バッチ処理のための最良の実践
- Run on Copy of Data: オリジナルのデータのコピーを常に処理し、元のデータ自体ではない。
- Log All Operations: 処理されたファイルの詳細なログを保存し、エラーが発生しました。
- テストファースト:データセット全体を処理する前に小さなサンプルで実行します。
- モニターディスクスペース: 出力ファイルのための十分なディスプレートを確保します。
- Handle Interruptions:非常に大きなバッチのためのチェックポイント/リズム機能の実装を検討します。
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
}許可エラー
アプリケーションが入力ディレクトリへのアクセスを読んでおり、出力ドレクターへのアクセスを書いていることを確認します。
結論
このチュートリアルは、Aspose.Medical を使用して C# で DICOM ファイルを匿名化する方法を示しています. 数百または数千のファイルが処理されるかどうかにかかわらず、バッチアプローチはデータセット全体を通じて一貫した匿名的化を保証し、生産の信頼性のために進歩の追跡とエラー処理を提供します。