見出し画像

DICOMデータ辞書

DICOM標準規格のパートPS3.6は、すべてのDICOM属性を符号化するために使用されるDICOMデータ辞書を含んでいます。実は、本解説を書いている私自身、最初はまったくDICOMデータ辞書が読めませんでした。というのも、読み方がよくわからなかったんですよね。

このような悩みを持たれている駆け出しのDICOMユーザの方がいらっしゃったら、もしこの記事が参考になれば幸いです。

DICOMは、辞書に記載されている標準的な属性だけでなく、DICOMベンダー独自の属性を利用する方法も提供しています。標準・独自いずれの属性でも、属性の構造は同じ規則に従うことになります。 この解説では、この規則について説明していきます。

標準DICOMデータ辞書

DICOMデータ辞書は、デジタル医療で使用される標準的なデータ項目(属性)を登録した辞書です。以降、属性という表現で統一します。

属性は、VRタイプにフォーマットされる必要があるので、属性に対応するVRも明示されています。

およそ5000を超えるすべての属性は(ちゃんと数えろや!って、すみません、、)、グループに分けられます。グループというのは、属性の意味などを参考にしたファジーな類似性の観点に基づき設定されます。

そして、各グループに振り分けられた属性は、さらに、個々の要素に分けられます。

最終的に、各属性は一意の(グループ,要素)タグでタグ付けされます。このことから、DICOM属性は、別名で「DICOMタグ」や「DICOMエレメント」「DICOMデータエレメント」とも呼ばれます。

次の図は、DICOMデータ辞書の抜粋です。

DICOMデータ辞書の一部抜粋

ご覧のように、最初の列(Tag)には16進数で表現されたタグ(グループ、エレメント)が示されています。

2番目は属性名の列です。DICOMとして扱える実世界のデータ項目種類を示しています(属性の名前ですね)。

(グループ,エレメント)タグは、属性名と一意に対応します。複数の属性で重複することはありません。なので、例えば、患者名の属性を辞書から検索したいと思ったら、タグの番号(0010, 0010)か、または、属性名(Patient Name)で検索して参照することができます。

属性へのタグ付けは非常に重要なDICOMの慣習です。(グループ,エレメント)タグは、データサイズが固定されており、厳格な16進数形式で管理されます。

デジタルなDICOMアプリケーションは、DICOMデータを扱う際、属性名ではなく、タグを使用して属性に格納された値を参照します。

次に、Keyword列は、属性名と似ていますが、属性を一語のキーワードとして扱うための用語を提供しています。

これは、DICOMアプリケーション開発のインターフェースでよく利用されるのですが、(グループ,要素)ペアに対するテキストによる代替手段として利用されています(なんだかんだ、タグよりも人間が読めるタグがありがたいということですね)。

VR列は、前の解説で紹介したように、各データ項目のデータ形式を指定します。 例えば、患者の生年月日(0010, 0030)は、DA VRフォーマット(8桁のYYYYMMDDデータ文字列)であることがわかります。

次に、Data element value multiplicity (VM) は、属性がVRタイプの値を1つだけ含むか、または複数含むかを定義しています。例えば、他の患者の名前属性 (0010, 1001) は、複数の名前を含むことができるので、VMは 1-n となっています。

複数の値を 1 つの要素に入れるにはどうすればよいでしょうか?DICOM は、複数の値を1つの複数値として連結したデータで扱うこともできます。例えば、属性に格納される値がバイナリ形式である場合(バイナリVRを持つ場合)、単にバイナリデータが連結されたデータが格納されることになります。

バイナリVRは、1つの値の長さが決まっており(例えば、SSは2バイト固定)、これを固定長で読み取ることができます。

一方、テキスト値は通常、固定長ではないので、バックスラッシュ(\)を区切り文字として使って複数の文字列を連結させます。

例えば、John Smithという患者が"Dr Jekyll"や"Mr Hyde"といった別の名前を使っていた場合、( 0010, 1001)には "Dr^Jekyll\Mr^Hyde "というように、VMをn = 2として、設定することができます。

VRの解説ですでに述べたように、バックスラッシュはDICOMにおいて非常に特殊な意味を持っています。それは複数値を分けるための「または」としての意味で用いられることです。 そのため、バックスラッシュは他の目的(ファイル名、日付など)には使用しない方がよいでしょう。

次に、Retired status列のRETラベルは、リタイアした属性を示します。リタイアした属性は、その役割がよりよく設計された新しい属性に割り当てられていると考えられます。

リタイアした属性は、以降も一部のDICOM装置やソフトウェアで使用される可能性があります。そのため、リタイアしたアイテムは永遠に辞書に残ります。完全に無視されることはありません。このようにしておくことで、優れたDICOMアプリケーションが、リタイアした属性も正しく処理することを助けています。

VRとDICOMデータ辞書の知識があれば、簡単な属性レベルでは、DICOMを使いこなすことができているといってもいいでしょう。

ここで、次のような文章を考えてみましょう。

「患者 John Smith、男性、1954年8月6日生まれ」

上の辞書の抜粋を見ると、この文には患者名、患者性別、患者生年月日という3つのデータ要素が利用できることがわかります。

そして、これらの属性はそれぞれ、PN、CS、DAがVRとして割り当てられています。

この文章に、タグ付けと、VRに従ったフォーマットを施すと、次のようにエンコードできます。

(0010, 0010)Smith^John (0010,0030)19540806 (0010,0040)M

これがDICOM化された文章です。

DICOMは複数の属性を、グループ、エレメントに沿って、昇順にソートします。そのため、文章では、氏名・性別・生年月日という並びになっていますが、その通りには属性が並びません。

※こうはならない
(0010, 0010)Smith^John (0010,0040)M (0010,0030)19540806

プライベートDICOMデータ辞書

標準のデータ辞書には、医用画像処理業界から厳選された約5,000以上の属性が収録されていました。これでは、未収録の項目に遭遇する確率はかなり低いのではと思われるのですが、もしこれが起こったら?どうでしょうか。

実際、DICOMやPACSのメーカーが、DICOMエンコードされたデータに独自のDICOM属性を追加する必要がある場合があります。

例えば、私たちがあるソフトウェアを設計し、そのソフトウェアが患者のミドルネームを別の項目として保存したいとしましょう。標準のデータ辞書ではこのような属性は提供されていないため、DICOMはこの問題に対して非常にシンプルなソリューションを提供します。

実は、すべての偶数の属性のグループ番号は、標準のDICOMデータ辞書で使用されるために予約されています。奇数のグループ番号は、私的利用のために確保されます。

患者のミドルネームの例の場合、独自のプライベートDICOMデータ辞書を作成し、値を格納することができます。例えば、次のように。

  • Tag:(0009,0010)

  • Name:Patient's Middle Name

  • VR:PN

  • VM:1

このとき、0009のような奇数の独自グループ番号と、好きな要素番号を使用できます。

このプライベート辞書は標準ではないので、他のDICOMアプリケーションは(0009,0010)タグが何を意味するのか分かりませんが、奇数グループ番号であることから(0009という)、プライベートタグであることを知ることができます。

DICOMは、基本的には、認識できないタグは無視するため、このプライベートタグを知らない(いらない)他のアプリケーションは、DICOMデータを読み込む際に( 0009, 0010)を完全にスキップすることになります。

しかし、現実にはそう単純ではありません。

他のアプリケーションが(0009, 0010)を他のプライベート属性に割り当てている可能性があるからです。

この場合、プライベートタグの非互換性という古典的な問題が発生します。

このような状況が起こった場合、このタグは完全に誤解されて利用されてしまいます。

DICOMは、PS3.5(Section 7.8.1)において、特定のタグをプライベートクリエータ・エレメントとして予約し、特定のプライベート辞書の実装者を符号化することによって、これを回避する努力を行っています。

これまでに、多くの人々が、プライベートの秘密を解き明かすという誘惑にかられ、プライベート辞書を追跡しようとしてきました。しかし、これらの辞書はほとんど公開されておらず、常に変化しているため、すべてのプライベートタグを追跡し続けることは困難です。

もし、プライベート属性がどうしても必要な時は、DICOMベンダに相談するほか無いようです。

標準DICOMコマンド辞書

標準規格のPS 3.6の標準DICOMデータ辞書を確認してきましたが、これらはデータ要素についての属性でした。データ要素は、例えば、CT画像のようなデータを構成するために必要なデータ要素です。

しかし、もし、何かの操作のための「コマンド」をエンコードする必要があるとしたらどうでしょうか?(コマンド?:←(溜め)→+P = サイコクラッシャー)

印刷(Print)、保存(Store)、移動(Move)、取得(Get)などのDICOMコマンドは、医用画像の臨床のワークフローで常に使用されていますが、PS  3.6のデータ辞書のどこにも明示されていません。実は、DICOM規格は、PS 3.6では、コマンド辞書を提供していません。その代わり、PS 3.7でコマンドメッセージオブジェクトとして、コマンドメッセージの使用と内容が詳細に説明されています。

DICOMは、データ要素と全く同じフォーマットでコマンドを符号化します。このとき、0000コマンドグループが使用されます。例えば、(0000, 0100)属性はコマンドタイプを表すため、(0000, 0110)属性はコマンドメッセージIDを表すために使用されています。

PS 3.7のAnnex Eには、コマンド辞書そのものが掲載されており、Annex A.1でも紹介されています。

また、プライベートなコマンド属性はサポートされていません。

DICOMネットワークで利用するコマンドについては、別の機会に、DICOMコマンドオブジェクトの例とともに、HowToを示したいと考えています。


Stay Visionary

この記事が気に入ったらサポートをしてみませんか?