DICOMオブジェクト:データグループのエンコーディング
DICOMオブジェクト:データエレメントのエンコードでは、ImplicitまたはExplicitエンコーディングの両方で、データエレメントがどのように符号化されるのかについて説明しました。
今回は、グループになったときのエンコードについて考えていきます。
すべてのDICOM属性は、グループで編成され、(グループ, 要素)のペアとしてタグ付けされていました。
例えば、DICOMデータ辞書のグループ:0010は、患者に関するすべての属性(名前、ID、体重、性別、年齢など)を集めたグループ、グループ:0028は、画像に関する情報(幅、高さ、色深度)専用で、グループ:7FE0は、ピクセルデータに関する属性のみから構成されています。
グループ番号が奇数のグループは、メーカーが独自のデータを格納するために予約しているプライベートグループであり、データ辞書には存在しません。
DICOMのデータエレメント(属性)がDICOMオブジェクトにエンコードされるとき、(グループ, エレメント)タグの番号が小さいものから先に書き込まれます。
従って、まず、タグは、グループ番号によって昇順に並べられ、そのあと、同じグループ内のタグは、さらにエレメント番号にそって並べられます。そして、その順に書き込まれます。
例えば、(0008, 0012)属性、(0008, 0014)属性の前に記録されます。また、(0010, 0010)はグループ番号が大きいので、最初の2つよりも後に書かれます。
(グループ, エレメント)タグの順序を除けば、DICOMデータグループのエンコーディングについて特に言及することはありません。
次に、少し特殊な(gggg, 0000)タグについて確認しておきます。このタグは2008年以降のDICOMでは廃止(PS3.5-2007を参照)されていますが、まだ多くの実装で利用される可能性があります。
このタグは、Group Length(gggg, 0000)データエレメントとして、UL VRかつVM=1のデータエレメントグループのために暗黙的に定義されていました。
各DICOMグループにおいて、最初のエレメント番号は0000です。このエレメント:0000を持つタグは、与えられたDICOMオブジェクトに存在するすべての同じグループ番号をもつ全属性の全データ長を保持するために慣習的に利用されています。
DICOMのすべてのデータおよびタグの長さは偶数ですから、グループの全データ長Lは、(gggg, 0000)データエレメントの終わりから、次のグループの始まりまでの偶数バイトとなります。(gggg, 0000)データエレメントそのもののデータ長はこの中に含みません。
この属性を利用する理由は、あるグループ:ggggに属する属性数が多い場合に、その属性をスキップしたり、あるいは、gggg属性のみをDICOMオブジェクトから読み込み、部分解析をしたい時などに役立つようです。
しかし、Group Lengthデータエレメントをセットするためには、最初の (gggg,0000) タグの後に書き込まれるすべての gggg エレメントの合計の長さを知る必要があります。
このことは、(gggg, 0000)エレメントをエンコードする前に、すべてのggggエレメントがすでに固定されて利用可能で、エンコード済みになっていることが求められます。
DICOMソフトウェア開発者にとっては、DICOMオブジェクトのデータ要素を変更すると、必然的に関連する要素のグループのデータ長に影響し、その都度、更新する必要が生じます。このような追加の処理は、いかに効率よく開発するかを考えるソフトウェア開発者にとっては受け入れられがたいのでしょう。あまりにも負担が大きいと認識されているようです。
そのため、ほとんどのDICOMソフトウェアでは、(gggg,0000)タグを無視するか、最悪、不正に書き込むことになります。
2007年以降のDICOMでは、Group Length(gggg,0000)タグが廃止されることになり、今後の標準規格からは見かけ上姿を消しています。しかし、DICOMアプリケーションは、このタグが提供されている場合、読み取ることができなければならないとされています。
そのため、ほとんどのDICOMソフトウェアは (gggg,0000) タグを読み取りますが、全く利用しません。
とはいえ、Group Lengthタグに遭遇した際に扱えるようにしておくことは無駄ではないでしょう。
DICOM ネットワークの接続性を確認するためにDICOM標準規格で使用されている単純なC-Echo-Requestオブジェクトを考えてみましょう。
C-Echoについては別の機会に解説します。今はこのオブジェクトの属性だけ読み取れればOKです。
C-Echo-Requestにエンコードされているデータを次に示します。
C-Echo-RequestはDICOMコマンドオブジェクトです。グループ:0000の属性(DICOMコマンド属性)のみを含み、Implicit VRエンコーディング(すべてのDICOMコマンドオブジェクトで利用される)で符号化されています。
上の表で示したように、このオブジェクトは、グループ:0000で、エレメント番号が、それぞれ、0000,0002,0100,0110,0800の5つの属性のみを含んでいます。
各エレメントのデータ長は、まず、(0000,0002)のようなグループとエレメントの番号からなるタグ部分が、常に2+2=4バイトでエンコードされ、値に対するデータ長も常に4バイトでエンコードされます。
これに、属性の値のデータ長を加えます。
(0000,0002)属性の場合は、4 byte(タグ分) + 4 byte(データ長フィールド分) + 18 byte(属性に格納される値のデータ長)= 26 byteとなります。
(0000,0000)に続く4つの属性のデータ長の合計は、26+10+10+10=56バイトとなります。よって、Group Length タグ(0000,0000)の値には56が格納されるという仕組みです。
Stay Visionary