DICOM クラウド PACS と C# のテレラディオロジーの匿名化

クラウドベースのPACS(画像アーカイブ・コミュニケーション・システム)とテレラディオロジーサービスは、診断画像へのリモートアクセスを可能にすることによって医療イメージを変換していますが、患者データをクラウン環境に移動するには、プライバシーとセキュリティに注意を払う必要があります。このガイドでは、DICOMの匿名化を実施する方法を示しています。 なぜクラウドとテレラディオロジーに匿名化するのか? DICOMの画像がクラウドストレージまたはリモートレッスンのために病院ネットワークを離れた場合、追加のプライバシーの考慮は適用されます。 データ居住所:異なる規制が適用される場合、患者データは地理的限界を越えることがあります。 第三者アクセス:クラウドプロバイダーおよびテレラジオサービスはHIPAAのビジネスパートナーです。 ネットワーク転送:インターネットを通過するデータは追加の保護が必要です。 マルチテナント環境:クラウドシステムは、複数の医療機関からのデータを保存することができます。 遠隔放射線学者:外部読者は患者識別器へのアクセスを必要としない場合があります。 匿名化は、他のセキュリティ対策が失敗した場合でも、患者のプライバシーを保護する安全層を作成します。 クラウドアップロード匿名化サービス クラウドアップロード前に DICOM ファイルを匿名化するサービスを作成する: using Aspose.Medical.Dicom; using Aspose.Medical.Dicom.Anonymization; public class CloudUploadAnonymizer { private readonly ConfidentialityProfile _profile; private readonly Dictionary<string, string> _studyIdMapping; private readonly string _organizationPrefix; public CloudUploadAnonymizer(string organizationPrefix) { _organizationPrefix = organizationPrefix; _studyIdMapping = new Dictionary<string, string>(); // Create profile optimized for cloud storage var options = ConfidentialityProfileOptions.BasicProfile | ConfidentialityProfileOptions.RetainDeviceIdentity | ConfidentialityProfileOptions.CleanDescriptions; _profile = ConfidentialityProfile.CreateDefault(options); } public CloudUploadResult AnonymizeForCloud(string inputPath, string outputPath) { var result = new CloudUploadResult { OriginalPath = inputPath, ProcessedAt = DateTime.UtcNow }; try { DicomFile dicomFile = DicomFile.Open(inputPath); var dataset = dicomFile.Dataset; // Capture original identifiers for mapping string originalStudyUid = dataset.GetString(DicomTag.StudyInstanceUID); string originalPatientId = dataset.GetString(DicomTag.PatientID); string originalAccession = dataset.GetString(DicomTag.AccessionNumber); // Generate cloud-safe identifiers string cloudStudyId = GetOrCreateCloudStudyId(originalStudyUid); result.OriginalStudyUID = originalStudyUid; result.CloudStudyId = cloudStudyId; result.OriginalPatientId = originalPatientId; // Apply anonymization var anonymizer = new Anonymizer(_profile); anonymizer.Anonymize(dataset); // Apply cloud-specific identifiers dataset.AddOrUpdate(DicomTag.PatientID, $"{_organizationPrefix}-{cloudStudyId}"); dataset.AddOrUpdate(DicomTag.PatientName, $"CloudStudy^{cloudStudyId}"); dataset.AddOrUpdate(DicomTag.AccessionNumber, cloudStudyId); // Add cloud tracking metadata dataset.AddOrUpdate(DicomTag.InstitutionName, _organizationPrefix); dicomFile.Save(outputPath); result.CloudPath = outputPath; result.Success = true; } catch (Exception ex) { result.Success = false; result.ErrorMessage = ex.Message; } return result; } private string GetOrCreateCloudStudyId(string originalStudyUid) { if (!_studyIdMapping.ContainsKey(originalStudyUid)) { string timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss"); string random = Guid.NewGuid().ToString("N").Substring(0, 8); _studyIdMapping[originalStudyUid] = $"{timestamp}-{random}"; } return _studyIdMapping[originalStudyUid]; } public Dictionary<string, string> GetStudyMapping() { return new Dictionary<string, string>(_studyIdMapping); } } public class CloudUploadResult { public string OriginalPath { get; set; } public string CloudPath { get; set; } public string OriginalStudyUID { get; set; } public string CloudStudyId { get; set; } public string OriginalPatientId { get; set; } public DateTime ProcessedAt { get; set; } public bool Success { get; set; } public string ErrorMessage { get; set; } } テレラジオのワークフロー統合 テレラジオの完全な匿名化パイプラインを構築する: ...

2月 25, 2025 · 8分

臨床試験のためのDICOM匿名化:C#実施ガイド

医療イメージを含む臨床試験は、患者プライバシーを保護するためにDICOMデータの慎重な処理を必要とし、規制的な提出のためのデータ統合性を維持します。このガイドでは、Aspose.Medical for .NET を使用して実施する方法をカバーしています。 臨床試験匿名化要件 臨床試験のためのDICOMファイルを匿名化することは、標準デ・識別とは異なります。 一貫性の対象識別器:各患者は、すべてのイメージセッションを通じて一致するユニークな試験対象 ID を取得しなければなりません。 監査トラック:何が匿名化され、いつ データの完全性:医療イメージの質は正確に維持されなければなりません。 再生可能性:同じ入力が同じ匿名出力を生成する必要があります。 21 CFR Part 11の遵守:電子記録は、FDAの正確性と誠実性の要件を満たす必要があります。 匿名化枠組みの導入 臨床試験の匿名化サービスを作成し、主題マッピングおよび監査ログを処理します。 using Aspose.Medical.Dicom; using Aspose.Medical.Dicom.Anonymization; using System.Collections.Concurrent; using System.Security.Cryptography; using System.Text; public class ClinicalTrialAnonymizer { private readonly string _trialId; private readonly ConcurrentDictionary<string, string> _subjectMapping; private readonly string _mappingFilePath; private readonly string _auditLogPath; public ClinicalTrialAnonymizer(string trialId, string dataDirectory) { _trialId = trialId; _mappingFilePath = Path.Combine(dataDirectory, $"{trialId}_subject_mapping.json"); _auditLogPath = Path.Combine(dataDirectory, $"{trialId}_audit_log.csv"); _subjectMapping = LoadOrCreateMapping(); InitializeAuditLog(); } private ConcurrentDictionary<string, string> LoadOrCreateMapping() { if (File.Exists(_mappingFilePath)) { var json = File.ReadAllText(_mappingFilePath); var dict = JsonSerializer.Deserialize<Dictionary<string, string>>(json); return new ConcurrentDictionary<string, string>(dict); } return new ConcurrentDictionary<string, string>(); } private void InitializeAuditLog() { if (!File.Exists(_auditLogPath)) { File.WriteAllText(_auditLogPath, "Timestamp,OriginalFile,AnonymizedFile,SubjectID,Operator,Action\n"); } } public string GetOrCreateSubjectId(string originalPatientId) { return _subjectMapping.GetOrAdd(originalPatientId, _ => { int subjectNumber = _subjectMapping.Count + 1; return $"{_trialId}-{subjectNumber:D4}"; }); } public void SaveMapping() { var json = JsonSerializer.Serialize( _subjectMapping.ToDictionary(k => k.Key, v => v.Value), new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(_mappingFilePath, json); } } 対象IDの置き換え 臨床試験には、すべてのイメージセッションを通じて一貫した主体識別が必要です。 ...

2月 18, 2025 · 6分
 日本