ASP.NET Core で DICOM 匿名化マイクロサービスを構築する
この包括的なガイドは、ASP.NET コアおよび Aspose.Medical を使用して製造準備済みの DICOM 匿名化マイクロサービスを構築し、アーキテクチャパターン、コード サンプル、ベスト 実践を含みます。
この包括的なガイドは、ASP.NET コアおよび Aspose.Medical を使用して製造準備済みの DICOM 匿名化マイクロサービスを構築し、アーキテクチャパターン、コード サンプル、ベスト 実践を含みます。
このガイドでは、CSV、JSON、またはXMLファイルを使用してカスタマイズされたDICOM匿名化プロファイルを作成する方法を示し、デコムの遵守を維持しながら、機関特定のプライバシー要件を満たします。
このガイドは、人工知能研究のための医療イメージデータセットの準備に関する完全なワークフローを示し、バッチの匿名化とMLパイプに導入するためのJSONフォーマットへの変換を含みます。
この総合的なガイドでは、DICOMの匿名化が医療プライバシー規則に重要な理由を説明し、Aspose.Medical DICOL Anonymizerを使用して .NET アプリケーションで適切な匿名的化を実施する方法を示しています。
メディカルイメージアプリケーションは、頻繁に検索し、効率的にDICOMのメタデータを検索する必要がありますが、DicOMファイルは豊富なメタルデータで保存され、データベースに抽出すると、迅速なリクエスト、分析、および病院情報システムとの統合が可能になります。このガイドでは、Aspose.Medical for .NET を使用して SQL および NoSQL データバックに DICOのメンタル情報を保存する方法を示しています。 なぜDICOMメタデータをデータベースに保存するのか? DICOM ファイルには幅広いメタデータが含まれていますが、数千のファイルを検索することは遅いです。 Fast queries: 患者、日付、モデル、またはいずれかの属性による研究を直ちに検索する アナリティクス:報告と統計のための統合データ 統合:画像データをEMR/EHRシステムに接続する スカラビリティ:適切なインデックスで数百万の研究を処理する フルテキスト検索:説明キーワードで研究を見つける DICOM メタデータ抽出財団 まず、DICOMをデータベース準備のオブジェクトに変換するメタデータ抽出器を作成します。 using Aspose.Medical.Dicom; public class DicomMetadataExtractor { public DicomStudyRecord ExtractStudyRecord(string filePath) { DicomFile dicomFile = DicomFile.Open(filePath); var dataset = dicomFile.Dataset; return new DicomStudyRecord { // Identifiers StudyInstanceUID = dataset.GetString(DicomTag.StudyInstanceUID), SeriesInstanceUID = dataset.GetString(DicomTag.SeriesInstanceUID), SOPInstanceUID = dataset.GetString(DicomTag.SOPInstanceUID), AccessionNumber = dataset.GetString(DicomTag.AccessionNumber), // Patient PatientID = dataset.GetString(DicomTag.PatientID), PatientName = dataset.GetString(DicomTag.PatientName), PatientBirthDate = ParseDicomDate(dataset.GetString(DicomTag.PatientBirthDate)), PatientSex = dataset.GetString(DicomTag.PatientSex), // Study StudyDate = ParseDicomDate(dataset.GetString(DicomTag.StudyDate)), StudyTime = dataset.GetString(DicomTag.StudyTime), StudyDescription = dataset.GetString(DicomTag.StudyDescription), ReferringPhysicianName = dataset.GetString(DicomTag.ReferringPhysicianName), // Series Modality = dataset.GetString(DicomTag.Modality), SeriesDescription = dataset.GetString(DicomTag.SeriesDescription), SeriesNumber = ParseInt(dataset.GetString(DicomTag.SeriesNumber)), BodyPartExamined = dataset.GetString(DicomTag.BodyPartExamined), // Image InstanceNumber = ParseInt(dataset.GetString(DicomTag.InstanceNumber)), Rows = ParseInt(dataset.GetString(DicomTag.Rows)), Columns = ParseInt(dataset.GetString(DicomTag.Columns)), // Equipment Manufacturer = dataset.GetString(DicomTag.Manufacturer), InstitutionName = dataset.GetString(DicomTag.InstitutionName), StationName = dataset.GetString(DicomTag.StationName), // File Info FilePath = filePath, FileSize = new FileInfo(filePath).Length, IndexedAt = DateTime.UtcNow }; } private DateTime? ParseDicomDate(string dicomDate) { if (string.IsNullOrEmpty(dicomDate) || dicomDate.Length != 8) return null; if (DateTime.TryParseExact(dicomDate, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out var date)) { return date; } return null; } private int? ParseInt(string value) { if (int.TryParse(value, out var result)) return result; return null; } } public class DicomStudyRecord { public string StudyInstanceUID { get; set; } public string SeriesInstanceUID { get; set; } public string SOPInstanceUID { get; set; } public string AccessionNumber { get; set; } public string PatientID { get; set; } public string PatientName { get; set; } public DateTime? PatientBirthDate { get; set; } public string PatientSex { get; set; } public DateTime? StudyDate { get; set; } public string StudyTime { get; set; } public string StudyDescription { get; set; } public string ReferringPhysicianName { get; set; } public string Modality { get; set; } public string SeriesDescription { get; set; } public int? SeriesNumber { get; set; } public string BodyPartExamined { get; set; } public int? InstanceNumber { get; set; } public int? Rows { get; set; } public int? Columns { get; set; } public string Manufacturer { get; set; } public string InstitutionName { get; set; } public string StationName { get; set; } public string FilePath { get; set; } public long FileSize { get; set; } public DateTime IndexedAt { get; set; } } SQL Server 統合 エンティティ・フレームワーク・コアで SQL Server に DICOM メタデータを保存する: ...
クラウドベースの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; } } テレラジオのワークフロー統合 テレラジオの完全な匿名化パイプラインを構築する: ...
DICOMファイルのコンテンツを理解することは、医療イメージの開発、トラブル解決、品質の確保に不可欠です このチュートリアルは、患者情報、研究の詳細、技術的なイメージパラメーターを抽出および表示するC#で総合的なディコムメタデータビューバーを構築する方法を示しています。 DICOMメタデータとは? DICOM ファイルには 2 つの主要なコンポーネントが含まれています: ピクセルデータ (実際の画像) と メタデータ(画像に関する情報)。 患者人口学:名前、ID、出生日、性別 研究情報:日付、時間、説明、参照医師 シリーズの詳細:モダリティ、身体部品、イメージプロトコル 画像パラメーター:サイズ、ピクセルスペース、ウィンドウ/レベル設定 機器情報:メーカー、モデル、ソフトウェア版 メタデータビューヤーは、開発者がデブギング、認証、データ分析のためにこれらの属性を検証するのに役立ちます。 基本メタデータ抽出 一般的なDICOM属性を抽出することから始めます: using Aspose.Medical.Dicom; public class DicomMetadataViewer { public DicomMetadata ExtractMetadata(string filePath) { DicomFile dicomFile = DicomFile.Open(filePath); var dataset = dicomFile.Dataset; return new DicomMetadata { // Patient Information PatientName = dataset.GetString(DicomTag.PatientName), PatientID = dataset.GetString(DicomTag.PatientID), PatientBirthDate = dataset.GetString(DicomTag.PatientBirthDate), PatientSex = dataset.GetString(DicomTag.PatientSex), PatientAge = dataset.GetString(DicomTag.PatientAge), // Study Information StudyInstanceUID = dataset.GetString(DicomTag.StudyInstanceUID), StudyDate = dataset.GetString(DicomTag.StudyDate), StudyTime = dataset.GetString(DicomTag.StudyTime), StudyDescription = dataset.GetString(DicomTag.StudyDescription), AccessionNumber = dataset.GetString(DicomTag.AccessionNumber), ReferringPhysician = dataset.GetString(DicomTag.ReferringPhysicianName), // Series Information SeriesInstanceUID = dataset.GetString(DicomTag.SeriesInstanceUID), Modality = dataset.GetString(DicomTag.Modality), SeriesDescription = dataset.GetString(DicomTag.SeriesDescription), SeriesNumber = dataset.GetString(DicomTag.SeriesNumber), BodyPartExamined = dataset.GetString(DicomTag.BodyPartExamined), // Image Information SOPInstanceUID = dataset.GetString(DicomTag.SOPInstanceUID), SOPClassUID = dataset.GetString(DicomTag.SOPClassUID), InstanceNumber = dataset.GetString(DicomTag.InstanceNumber), ImageType = dataset.GetString(DicomTag.ImageType), // Technical Parameters Rows = dataset.GetString(DicomTag.Rows), Columns = dataset.GetString(DicomTag.Columns), BitsAllocated = dataset.GetString(DicomTag.BitsAllocated), BitsStored = dataset.GetString(DicomTag.BitsStored), PixelSpacing = dataset.GetString(DicomTag.PixelSpacing), SliceThickness = dataset.GetString(DicomTag.SliceThickness), // Equipment Information Manufacturer = dataset.GetString(DicomTag.Manufacturer), ManufacturerModelName = dataset.GetString(DicomTag.ManufacturerModelName), StationName = dataset.GetString(DicomTag.StationName), InstitutionName = dataset.GetString(DicomTag.InstitutionName), SoftwareVersions = dataset.GetString(DicomTag.SoftwareVersions) }; } } public class DicomMetadata { // Patient public string PatientName { get; set; } public string PatientID { get; set; } public string PatientBirthDate { get; set; } public string PatientSex { get; set; } public string PatientAge { get; set; } // Study public string StudyInstanceUID { get; set; } public string StudyDate { get; set; } public string StudyTime { get; set; } public string StudyDescription { get; set; } public string AccessionNumber { get; set; } public string ReferringPhysician { get; set; } // Series public string SeriesInstanceUID { get; set; } public string Modality { get; set; } public string SeriesDescription { get; set; } public string SeriesNumber { get; set; } public string BodyPartExamined { get; set; } // Image public string SOPInstanceUID { get; set; } public string SOPClassUID { get; set; } public string InstanceNumber { get; set; } public string ImageType { get; set; } // Technical public string Rows { get; set; } public string Columns { get; set; } public string BitsAllocated { get; set; } public string BitsStored { get; set; } public string PixelSpacing { get; set; } public string SliceThickness { get; set; } // Equipment public string Manufacturer { get; set; } public string ManufacturerModelName { get; set; } public string StationName { get; set; } public string InstitutionName { get; set; } public string SoftwareVersions { get; set; } } すべてのDICOMタグを閲覧 すべてのタグを完全な検査のためにDICOMファイルにリストする: ...
XMLは、医療データの交換、HL7メッセージ、企業統合エンジン、および遺産病院情報システムを強化する角の石であり続けています。DICOMメタデータをXMLに変換すると、医学イメージシステムとより広範な医療ITインフラストラクチャの間の無限の組み合わせが可能になります。このガイドでは、Aspose.Medical for .NET を使用してDIKOM を XML に転換する方法を示しています。 なぜXMLは健康保健統合のためのものですか? JSON が現代の Web APIs を支配している間、XML は、いくつかの理由で医療に不可欠です。 HL7標準:HL7 v2 および v3 メッセージは、XML ベースのフォーマットを広く使用します。 エンタープライズ統合:多くの保健整合エンジン(Mirth Connect、Rhapsody)は主にXMLで動作します。 Legacy システム:設立された病院情報システムには、XML データフィードが必要です。 ドキュメント基準:CDA(臨床文書アーキテクチャ)およびその他のクリニック文献はXMLを使用します。 認証: XML スケジュール(XSD)は、強力なデータ認定機能を提供します。 DICOM から XML への変換 DICOM から XML に変換する最も簡単な方法: using Aspose.Medical.Dicom; using Aspose.Medical.Dicom.Serialization; public class DicomXmlConverter { public string ConvertToXml(string dicomFilePath) { // Load DICOM file DicomFile dicomFile = DicomFile.Open(dicomFilePath); // Serialize to XML string string xml = DicomXmlSerializer.Serialize(dicomFile.Dataset); return xml; } public void ConvertToXmlFile(string dicomFilePath, string outputXmlPath) { DicomFile dicomFile = DicomFile.Open(dicomFilePath); using (var stream = new FileStream(outputXmlPath, FileMode.Create)) { DicomXmlSerializer.Serialize(stream, dicomFile.Dataset); } } } フォーマット XML 出力 人間で読めやすい生産とデブギング: ...
医療イメージを含む臨床試験は、患者プライバシーを保護するために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の置き換え 臨床試験には、すべてのイメージセッションを通じて一貫した主体識別が必要です。 ...
現代の医療アプリケーションは、医療イメージデータを閲覧および管理するためのウェブベースのインターフェイスにますます依存しています. DICOM ファイルを JSON に変換すると、JavaScript フレームワーク、REST APIs およびクラウド プラットフォームとの無制限の統合が可能になります. このガイドでは、Aspose.Medical for .NET を使用して C# で Dicom から Json をコンバータする方法を示しています。 なぜDICOMをJSONに変換するのか? DICOM(Digital Imaging and Communications in Medicine)は医療イメージの標準形式ですが、そのバイナリー構造は、Webアプリケーションで働くことを困難にします。 JavaScript互換性:JSONは、React、Vue、Angularなどのウェブブラウザやフロントエンドフレームワークに先立っています。 REST API 統合: JSON は現代の Web API のデフォルト標準です。 データベースストレージ: モンゴDB のような NoSQL データベルトは JSON ドキュメントを本質的に保存します。 人間の読みやすさ:JSONはバイナリーDICOMに比べて簡単に検査およびデビューできます。 DICOM PS3.18 は、DICOME データの JSON 表現を定義し、医療システム間の互換性を確保します。 あなたの .NET プロジェクトの設定 まず、Aspose.Medical for .NET をインストールし、測定されたライセンスを設定します。 using Aspose.Medical; using Aspose.Medical.Dicom; using Aspose.Medical.Dicom.Serialization; // Activate metered license Metered metered = new Metered(); metered.SetMeteredKey("your-public-key", "your-private-key"); DICOM から JSON への変換 DICOM ファイルを JSON に変換する最も簡単な方法: ...