DUICUO

Fo-dicom オープンソース ライブラリは、DICOM 標準の基本要件をどのように満たしていますか?

DICOMの基本概念

DICOM(Digital Imaging and Communications in Medicine:医療におけるデジタル画像および通信)は、デジタル医用画像および通信に関する国際標準規格です。医用画像および関連するテキスト情報やデータ情報の記述、伝送、保存、取得、印刷、表示に使用されます。米国電機工業会(NEMA)と医療機器工業会(MITA)によって開発されたDICOM規格は、医用画像処理および管理における世界標準となっています。

DICOM規格は、異なるデバイスやシステム間での医用画像とデータのシームレスな相互運用性を定義します。これは、画像と関連情報の完全性と正確性を確保しながら、異なるメーカーのデバイス間で画像を転送・共有できることを意味します。#dicom#規格は、CT、MRI、X線、超音波、核医学など、様々な医用画像診断法をサポートしています。

DICOM規格は、ファイル形式、データ要素、サービスクラス、ネットワークプロトコルなど、様々な側面を網羅しており、様々なプログラミング言語やソフトウェアライブラリを用いて実装・適用できます。一般的なDICOMソフトウェアライブラリには、fo-dicom、dcmtk、GDCM、dcm4che、pydicomなどがあります。

2023年12月現在、DICOMの最新バージョンはDICOM 3.0です。DICOM規格は、医療画像および通信技術の発展に合わせて、リリース以来継続的に更新・改訂されており、新機能の追加や既存機能の改良が行われています。そのため、DICOMのバージョンは時間の経過とともに変更される可能性があります。

fo-dicom は DICOM 標準の基本要件をどのように満たしていますか?

fo-dicomは、DICOM規格に準拠したC#実装ライブラリです。DICOM規格の基本要件を満たしており、以下の要件を満たしています。

  • DICOM データ形式をサポート: fo-dicom は、DICOM データ形式の読み取り、解析、生成をサポートし、さまざまな種類の DICOM ファイルとデータ ストリームを簡単に処理できます。
  • DICOM ネットワーク通信の実装: fo-dicom は DICOM ネットワーク通信プロトコルを実装し、クエリ、取得、保存、送信操作など、リモート DICOM デバイスとの通信をサポートします。
  • DICOM メタデータの解析: fo-dicom は、識別子、シーケンス、属性値、VR (値表現)、長さなど、DICOM データセット内のメタデータ情報を解析できます。
  • DICOM 画像データの処理: fo-dicom は、ピクセル データ配列の読み込み、表示、処理など、DICOM 画像データを処理でき、複数のカラー スペースとビット深度をサポートします。
  • DICOM セキュリティをサポート: fo-dicom は、TLS 暗号化や認証などの DICOM セキュリティ メカニズムをサポートし、通信のセキュリティと信頼性を確保します。

開発を始める前に、fo-dicom 構築の基本的な概念をいくつか理解しましょう。

1. DicomElement:

fo-dicomにおいて、DicomElementはDICOMデータセット内の単一の要素を表すために使用されるクラスです。各DICOM要素は、タグ、値、およびその他の属性で構成されます。

タグ: DICOMタグは、DICOMデータセット内の各要素を識別するために使用される、2つの16ビット数値で構成される一意の識別子です。タグは「XXXX,XXXX」という形式で表されます。ここで、「XXXX」は16ビットの16進数値です。タグは、ピクセル値、画像の位置、患者情報など、データのさまざまな属性を表すことができます。

例えば、Tag.SOPClassUIDはSOPクラスを表すラベルです。その値は0008,0016であり、すべてのDICOMデータセットには、データセット内のSOPカテゴリを指定するためにこのラベルが含まれている必要があることを示しています。

値: DicomElementクラスのValueプロパティは、DICOM要素の値を保持します。この値は単一の値、または複数の値のシーケンスになります。複数の値のシーケンスの場合は、DicomSequenceクラスを使用してシーケンス内の各要素を表すことができます。

たとえば DICOM 要素の値が文字列の場合、 DicomElement.GetString()メソッドを使用して文字列値を取得できます。

VR (値表現): VR プロパティは、DICOM 要素の値のデータ型を示します。

たとえば、DicomVR.PN は人の名前の表現方法を表します。

VM (値の多重度): VM 属性は、DICOM 要素に許可される値の数を示します。

たとえば、DicomVR.PN の VM プロパティは1 です。これは、Person Name に許可される値が 1 つだけであることを意味します。

長さ (値の長さ): 長さ属性は、DICOM 要素値の長さをバイト単位で示します。

例えば DICOMデータセットに患者名を表す要素があり、ラベルは0010,0010 、値は「John Doe」であるとします。fo-dicomでは、この要素は以下の方法で作成およびアクセスできます。

 DicomElement element = new DicomElement(DicomTag.PatientName, "John Doe"); string tag = element.Tag.ToString(); // "0010,0010" string value = element.GetString(); // "John Doe" DicomVR vr = element.ValueRepresentation; // DicomVR.PN int vm = element.ValueMultiplicity; // 1 int length = element.Length; // 8

DicomElement を使用すると、DICOM データセット内の各要素のラベル、値、その他の属性に簡単にアクセスして操作できます。

2. Dicomデータセット:

fo-dicomにおいて、DicomDatasetは完全なDICOMデータセットを表すために使用されるクラスです。DICOMデータセットは複数のDICOM要素で構成され、各要素は固有のタグと対応する値を持ちます。DicomDatasetは、DICOMデータセットの処理、読み取り、および書き込み機能を提供します。

DicomDataset クラスには、次の機能と関数があります。

  • DICOM要素の保存:DicomDatasetは複数のDICOM要素を保持できます。要素を追加、削除、変更することで、DICOMデータセットを操作できます。
  • 要素の取得と設定:DICOMデータセット内の要素は、タグを使用して取得および設定できます。要素には、DicomTagまたは文字列で表されるタグを使用してアクセスできます。
  • DICOMデータの保存と読み込み:DicomDatasetは、DICOMデータのファイルへの保存とファイルからの読み込みをサポートしています。ファイルの読み書きには、DicomFileクラスを使用できます。

例えば、患者名と患者IDを含むDICOMデータセットがあるとします。DicomDatasetクラスを使用して、これらの要素を作成し、アクセスできます。

 DicomDataset dataset = new DicomDataset(); // 添加元素dataset.Add(new DicomElement(DicomTag.PatientName, "John Doe")); dataset.Add(new DicomElement(DicomTag.PatientID, "12345")); // 获取元素值string patientName = dataset.GetSingleValue<string>(DicomTag.PatientName); string patientID = dataset.GetSingleValue<string>(DicomTag.PatientID); // 修改元素值dataset.AddOrUpdate(DicomTag.PatientName, "Jane Smith"); // 删除元素dataset.Remove(DicomTag.PatientID);

DicomDatasetを使用すると、DICOMデータセット内の要素を簡単に作成、アクセス、操作できます。この機能により、fo-dicomにおけるDICOMデータ処理がよりシンプルかつ効率的になります。

3. Dicomファイル:

fo-dicomにおいて、DicomFile(DICOMファイル)はDICOMファイルを表すクラスです。DICOMファイルは通常、拡張子.dcmまたは.dicomで保存され、完全なDICOMデータセットを含んでいます。DicomFileクラスは、DICOMファイルの読み書き機能を提供します。

DicomFile クラスには、次の特性と機能があります。

  • DICOM データセットの保存: DicomFile は、複数の DICOM 要素を含む完全な DICOM データセットを保持できます。
  • DICOMファイルの読み込み:DicomFileクラスは、ディスクからDICOMファイルを読み込み、DicomDatasetオブジェクトに変換するために使用できます。ファイルの読み込み時には、エンコーディングとバイトオーダーをオプションで指定できます。
  • DICOMファイルへの書き込み:DicomFileクラスは、DicomDatasetオブジェクトをディスクに書き込み、新しいDICOMファイルを生成するために使用できます。ファイルの書き込み時に、エンコーディングとバイトオーダーを指定できます。

たとえば、患者の名前と患者 ID を含む DICOM データセットがあるとします。この場合、DicomFile クラスを使用してそれをディスクに保存できます。

 DicomDataset dataset = new DicomDataset(); dataset.Add(new DicomElement(DicomTag.PatientName, "John Doe")); dataset.Add(new DicomElement(DicomTag.PatientID, "12345")); // 将数据集写入到磁盘中string filePath = "C:\\temp\\mydicomfile.dcm"; DicomFile file = new DicomFile(dataset, filePath); file.Save();

あるいは、ディスクから DICOM ファイルを読み取り、DicomDataset オブジェクトに変換することもできます。

 // 从磁盘中读取DICOM 文件DicomFile file = DicomFile.Open(filePath); // 将文件内容转换为数据集DicomDataset dataset = file.Dataset; // 获取元素值string patientName = dataset.GetSingleValue<string>(DicomTag.PatientName); string patientID = dataset.GetSingleValue<string>(DicomTag.PatientID);

DicomFileを使用すると、DICOMファイルを簡単に読み書きし、その内容をDicomDatasetオブジェクトに変換できます。この機能により、fo-dicomにおけるDICOMデータ処理がよりシンプルかつ効率的になります。

4. ディコムタグ:

fo-dicomにおいて、DicomTagはDICOMデータセット内の要素識別子を表すために使用されるクラスです。各DICOM要素には、要素の型、値、長さ、位置などの情報を指定する一意のタグが付与されます。

DicomTag クラスには、次の特性と機能があります。

  • DicomTag クラスは、グループ番号や要素番号など、DICOM データセット内の要素の識別子を表すために使用されます。
  • タグ属性の取得: DicomTag クラスを使用して、グループ番号、要素番号、VR などのタグ属性を取得できます。
  • DICOM 要素へのアクセス: DicomTag クラスを使用して、DICOM データセット内の特定のタグを持つ要素にアクセスできます。

例えば、患者名と患者IDを含むDICOMデータセットがあるとします。DicomTagクラスを使用して、これらの要素を作成し、アクセスできます。

 // 创建标签DicomTag patientNameTag = new DicomTag(0x0010, 0x0010); DicomTag patientIDTag = new DicomTag(0x0010, 0x0020); // 获取标签属性int groupNumber = patientNameTag.Group; int elementNumber = patientNameTag.Element; string vr = patientNameTag.VR.Code; // 访问DICOM 元素DicomDataset dataset = new DicomDataset(); dataset.Add(new DicomElement(patientNameTag, "John Doe")); dataset.Add(new DicomElement(patientIDTag, "12345")); string patientName = dataset.GetSingleValue<string>(patientNameTag); string patientID = dataset.GetSingleValue<string>(patientIDTag);

DicomTagを使用すると、DICOMデータセット内の要素識別子を簡単に作成、アクセス、操作できます。この機能により、fo-dicomにおけるDICOMデータ処理がよりシンプルかつ効率的になります。

DICOM規格の新しいバージョンには、新しいDICOMラベルの追加や古いラベルの削除が含まれる場合があることに特に注意が必要です。DICOM規格は、医療分野のニーズと技術の進歩に合わせて常に進化しています。DICOM規格は、国際電気標準会議(IEC)と国際標準化機構(ISO)によって共同で開発・管理されており、業界の幅広い参加と専門家によるレビューを受けています。DICOM規格の新しいバージョンはそれぞれ、医療現場のニーズと技術開発に基づいて更新・拡張されています。DICOM規格の新しいバージョンでは通常、新しい画像、測定値、機能などをサポートするために新しいラベルが導入されています。これらの新しいラベルは、新しい医療機​​器、新しい画像処理アルゴリズム、または新しいデータ要件を説明するために使用できます。

同時に、古いバージョンのDICOMラベルは削除または廃止される可能性があります。一部のラベルは、時代遅れになったり、現在の医療慣行に適合しなくなったりしたため、新しいバージョンでは使用できなくなる場合があります。このような変更により、DICOM規格の正確性、一貫性、および適応性が確保されます。

したがって、DICOMデータセットを正しく解釈・処理するには、最新のDICOM規格を理解し、常に最新の状態を維持することが重要です。開発者とユーザーは、DICOM規格の最新バージョンを常に把握し、使用するライブラリやツールがそのバージョンをサポートしていることを確認して、最適な互換性と機能性を確保する必要があります。

5. DicomServiceClass(DICOMサービスクラス) :

fo-dicomにおいて、DicomServiceはDICOMネットワーク通信に関連するサービスを表す抽象クラスです。DICOM接続の確立、DICOM操作の実行、およびDICOMデータの処理のための一連のメソッドとプロパティを提供します。

DicomService には次の基本概念が含まれています。

  • 接続:DicomService は、DICOM 接続を確立および管理するための機能を提供します。接続要求を待機するサーバーとして、またはリモートサーバーへの接続を開始するクライアントとして機能します。
  • 操作: DicomService は、様々な DICOM 操作を実行するためのメソッドを定義します。これらの操作には、クエリ、取得、保存、送信が含まれます。これらのメソッドを使用することで、リモート DICOM デバイスにリクエストを送信し、レスポンスを受信して​​処理することができます。
  • イベント:DicomService は、DICOM 通信に関連するイベントをキャプチャおよび処理するための一連のイベントを提供します。例えば、OnConnectionClosed イベントを処理して接続の切断を処理したり、OnCStoreRequest イベントを処理してストレージ要求を処理したりできます。

例えば、DicomServerクラスはfo-dicomの具象クラスであり、DICOMサーバーを実装するために使用されます。以下にサンプルコードを示します。

 // 创建DICOM 服务端实例DicomServer server = new DicomServer(); // 设置服务端的参数和配置server.AETitle = "MY_AE_TITLE"; server.Port = 11112; // 处理连接建立的事件server.OnConnectionRequest += (sender, e) => { Console.WriteLine("收到连接请求:" + e.Association.CallingAETitle); // 接受连接请求e.AcceptAssociation(); }; // 处理存储请求的事件server.OnCStoreRequest += (sender, e) => { Console.WriteLine("收到存储请求:" + e.File.Dataset.GetSingleValueOrDefault<string>(DicomTag.PatientName, "")); // 存储请求处理逻辑... // 发送存储响应e.SendResponse(DicomStatus.Success); }; // 启动服务端并开始监听连接server.Start(); Console.WriteLine("DICOM 服务端已启动,监听端口:" + server.Port); // 等待用户按下任意键停止服务端Console.ReadKey(); // 停止服务端server.Stop(); Console.WriteLine("DICOM 服务端已停止。");

上記の例では、DicomServerインスタンスを作成し、AEタイトルやリスニングポートなどのサーバーパラメータを設定しました。次に、OnConnectionRequestイベントをサブスクライブして、受信した接続要求を処理しました。接続要求を受信すると、対応するメッセージを出力し、接続を承認しました。また、OnCStoreRequestイベントをサブスクライブしてストレージ要求を処理しました。ストレージ要求を受信すると、患者名を出力し、ストレージ応答を送信しました。最後に、サーバーを起動し、接続のリッスンを開始しました。

DicomServerなどのDicomServiceの特定の実装を使用することで、カスタムDICOMサーバーまたはクライアントを容易に実装し、DICOM通信に関連する様々な操作やイベントを処理できます。これにより、fo-dicomにおけるDICOMネットワーク通信はより柔軟でカスタマイズ可能になります。

これはDICOM通信において非常に重要な部分です。この部分については後ほど詳しく分析し、皆さんに共有したいと思います。

6. ディコムイメージ:

fo-dicomにおいて、DicomImageはDICOM画像データを表すために使用されるクラスです。DICOM画像の読み込み、表示、操作のための一連のメソッドとプロパティを提供します。

DicomImage には次の基本概念が含まれています。

  • データセット: DicomImageはDICOMデータセットに基づいて構築されます。このデータセットには通常、ピクセルデータサイズ、サンプリングレート、色空間など、画像に関するメタデータ情報が含まれます。データセットは、DicomFileクラスまたはDicomDatasetクラスを使用してDICOMファイルまたはデータストリームから読み取ることができます。
  • ピクセルデータ:DicomImageには、画像のピクセル値を格納する1つ以上のピクセルデータ配列が含まれています。GetPixelDataメソッドを使用して、これらのピクセルデータ配列を取得できます。画像の色空間とビット深度に応じて、異なるピクセルデータタイプを使用してピクセル値を表現できます。
  • 表示: DicomImage は、画像ビューに画像を表示するための一連のメソッドとプロパティを提供します。特定の画像表示は、WPF または WinForms コントロールを使用して実装できます。

たとえば、 DicomImage クラスを使用する場合のサンプル コードは次のようになります。

 // 从DICOM 文件中加载图像数据集DicomFile dicomFile = DicomFile.Open("image.dcm"); DicomImage dicomImage = new DicomImage(dicomFile.Dataset); // 获取图像的像素数据数组ushort[] pixelData = dicomImage.GetPixelData<ushort>(); // 显示图像WpfImageViewer imageViewer = new WpfImageViewer(); imageViewer.Image = dicomImage.RenderImage(); imageViewer.Show();

上記の例では、まずDicomFileクラスを使用してDICOMファイルから画像データセットを読み取り、次にDicomImageインスタンスを作成し、データセットをパラメータとして渡します。次に、GetPixelDataメソッドを使用してピクセルデータの配列を取得し、pixelData変数に格納します。最後に、WpfImageViewerコントロールを使用して画像を表示します。

DicomImageクラスを使用すると、DICOM画像データの読み込み、表示、処理が簡単に行えます。これにより、fo-dicomにおけるDICOM画像処理がより便利かつ効率的になります。

要約

上記で紹介した基本概念は、扱われる多くのトピックのほんの一部に過ぎません。しかし、これらの概念はfo-dicomの使用時に頻繁に参照されるため、DICOMデータを正常に処理するには、その意味と使用方法を理解することが重要です。