DICOM～ダイコムから情報を読み出す～
ダイコムから情報を読み出す

DICOMとは
現在、医療画像の形式として利用されている
現在
医療画像の形式として利用されているCT,MR,PETなどの画像も全部この形式
DICOM 単に画像データだけではなく単に画像デ タだけではなく多くの情報が含まれている(例として、機械, 検査日時, 病院名や患者の名前や誕生日 検査の種類,誕生日,検査の種類 検査部位,検査部位 シークエンスの名前,シークエンスの名前
Filed of View, 患者のポジション, スライスの厚み,ピクセルデータの間隔, シリーズ数,シリーズナンバーなどが入っていてこのほかにもたくさんある)基本知識の確認
文字は 文字で byteを使って表現される.
文字は1文字で1byteを使って表現される.
1byte = 8bit であり、1byteでは2の8乗、ありは乗すなわち256まで数えることができる.
すなわち256まで数えることができる
これから出てくる数字は16進数なので、1b t は二桁の数字であらわされる
1byteは二桁の数字であらわされる。
(例として70なら16進数で 46 と表される)(例として70なら16進数で’46’と表される)

DICOMヘッダー
DICOMヘッダ
G(Group)、E(Element)、VR(ValueRepresentation)、Dataの連続で構成
GE

VR

GE

VR

Data

GE

data

G

Data
………

VR

data
E

VR

………
G

E

VR
→→

例として
(G,E)=(7FE0，0010)
VR OW+画像長
VR=OW+画像長

IMAGE

DICOMヘッダー
DICOMヘッダ
G（Gloup）、E（Element)とは・・・• 2Byte分それぞれ使われている• あるDataの名前（タグ）• タグの番号とそれに対応するDataは
DICOM規格により決ま ている
DICOM規格により決まっているDICOMヘッダー
DICOMヘッダ
VR(Value Representation)とは・・・• 4Byte分使われている
4B t 分使われている• 中身は最初の2ByteがDataの形式で、最初y、残りの2ByteがData長となっている
D t の形式とはDataの形式とは・・・–DS、USなどといった文字が入っている例）DS(Decimal String)はDataが10進数を示す文字列であることを示す

DICOMヘッダー
DICOMヘッダ
VR(Value Representation)とは・・・
例外1）Dataの形式はDICOMによっては入っていないことがある⇒4Byte分すべてを使ってData長が入っている
例外2）Data形式が画像Dataの際に使われるOW(Other Word String)のときは、
D t 長が画像D t 長となるので 残Data長が画像Data長となるので、残り2Byteには入りきらない⇒この2B t には何も入らず 次⇒この2Byteには何も入らず、次の4ByteにData長が入る

DICOMヘッダー
DICOMヘッダ
Dataとは・・・• VRに書いてあるData長分のByte数でVRに書いてあるD t 長分のB t 数で書かれている• Dataから、画像情報・患者情報・撮影についてなどの情報を得ることができる• Data得るにはタグを見つける必要があ
Data得るにはタグを見 ける必要がある

DICOM画像
DICOMヘッダー後に入っており、画像
ダ 後に入おり 画像
Dataに対応するタグは(７FE0 0010)でDataに対応するタグは(７FE0,0010)である
G

E

VR

G

E

VR

Data

G

E

data

G

Data
………

VR

data
E

VR

………
G

E

VR
→→

例として
(G,E)=(7FE0，0010)
VR OW+画像長
VR=OW+画像長

IMAGE

プログラムDICOMの読み方(ヘッダー)・・・
DICOMの読み方(ヘッダ)
1. 2Byteずつ読み、ほしいgroupを探す[br.ReadInt16()で2byteずつ読める]
2. ほしいgroupが見つかったら、そのすぐ次の2B ( l
次の2Byte(element)を読む)を読む[br ReadInt16()で2byteずつ読める][br.ReadInt16()で2byteずつ読める]
3. 目的のタグであったらVRからData長を読み、そのByte分Dataを読むプログラムDICOMの読み方(画像)・・・
1. タグ(７FE0,0010)を見つける
グ
2 VRにOWがあるかどうかを調べる
2.
3． OWがなければ、VRの次から画像Dataがなければ、 の次から画像が入っており、OWがあれば、次の4Byteに画像Data長があるので、その次から画像D t が入 ている
画像Dataが入っている

プログラムDICOMの読み方(画像)・・・
OWがあるとき(2Byte表示)
・・・

7FE00010

group element

O W

VRIImage空白

4ByteにData長OWがないとき(2Byte表示)
がな とき( y 表示)
・・・

7FE00010Imagegroupgp element VR=4ByteにData長・・・・・・

プログラムプログラムの書き方(今回は画像の縦幅を読んでいる)グラ
書 方(今回 画像 縦幅を読)
BinaryReader br = new BinaryReader(ofd.OpenFile());//group 0028 element 0010
int data
data, height;char[] VR = new char[10];while (true){ if (br(br.ReadInt16()
ReadInt16() == 0x0028){if (br.ReadInt16() == 0x0010){for (int i = 0; i < 4; i++) {VR[i] = br.ReadChar();}if (VR[0] == 'U' && VR[1] == 'S')
{data = VR[2] + VR[3] * 256; }else{data = VR[0] + VR[1] * 256 + VR[2] * 256 * 256 + VR[3] * 256 * 256 * 256;}
height = br.ReadInt16();
break;}}}
br Close();br.Close();textBox1.Text =height.ToString();プログラム
読み取りの注意点
読み取りの注意点・・・
例) タグ＝(0018,0050)を探している場合で、下の図のようなとき①の場所でgroupが一致するので、①が②②の場所をelementとして読む。
Element が一致しないので break し③を groupとして読む。
（ここで注意してほしいのが数字の順番である
下の図で感覚的に0018 0050を探してしまいがちだが今下の図で感覚的に0018,0050を探してしまいがちだが今回の形式では下の桁から読み取っているので1800とな ている部分を ンピ
1800となっている部分をコンピュータは0018と認識する）
タは0018と認識する）
①00

…

…

00

00

group
=(0000)

18

②00

group
=(0018)18③00

element=(0018)

5000

group
=(0050)…

…

実演（DICOMから名前を読む）
まず、C#を開き,ツールボックスから
まずC#を開き ツ ルボ クスからボタンとテキストボックスを配置してみよう実演
作ったボタンをダブルクリックして作たボタンをダブルクリ クしてボタンのイベントハンドラーを作ろう。

実演
コード画面上部のusing～にSystem.IOを書き込み
ド部を書き

実演
書き終わったら動かしてみよう