DICOM 画 像 変 換 ツール (DICOM Image Converter) ( 株 )アイプランツ システムズ 1
Dicom Image Converter 本 ツールの 目 的 複 数 の DICOM スライス 画 像 ファイルから DICOM ヘッダを 取 り 除 き 画 像 データのみの Raw ファイルを 抽 出 します 複 数 の DICOM スライス 画 像 ファイルを 読 み 込 み 一 つの VOL( 付 録 参 照 )ファイルへ 変 換 し 対 応 する VIF ファイルを 作 成 します ケース 1)vif/vol ファイル 出 力 Vif/vol 出 力 ( 標 準 ) DICOM 画 像 Vif/vol 出 力 ( 分 割 ) Vif/vol 出 力 ( 穴 埋 め) 2
ケース 2)raw ファイル 出 力 DICOM ヘッダ 画 像 データ 画 像 データ DICOM 画 像 ( 一 枚 ) Raw データ( 一 枚 ) 3
使 用 方 法 1 2 3 4 5 6 機 能 1 DICOM フォルダ 選 択 選 択 ボタンをクリックし DICOM ファイルが 保 存 されている フォルダを 指 定 します 2 出 力 パス 選 択 選 択 ボタンをクリックし 変 換 後 のファイルパスとファイル 名 を 入 力 します ファイル 名 に 拡 張 子 を 付 加 する 必 要 はありませ ん DICOM ヘッダ 削 除 vif/vol 形 式 出 力 3 出 力 形 式 選 択 DICOM ファイルからヘッダ 複 数 の DICOM ファイルを 一 を 取 り 除 いた 画 像 データ 部 つのファイルにまとめ のみを 抽 出 します 出 力 形 式 は.raw ファイルとなります Volume Extractor 用 フォー マットで 出 力 します 3において vif/vol 形 式 出 力 を 選 択 したときのみ 選 択 可 能 です 標 準 欠 落 部 分 穴 埋 め 欠 落 部 で 分 割 4 vif / vol 出 力 オプション フォルダ 内 の DICOM 画 像 を 単 純 に 結 合 しま す DICOM ファイルのス ライス 間 隔 を 調 べ ス ライス 間 隔 の 大 きい 箇 所 を 全 DICOM ファイ ルの 最 小 値 で 埋 めた vol ファイルを 作 成 し ます DICOM ファイルの スライス 間 隔 を 調 べ スライス 間 隔 の 等 しい 箇 所 を 一 つの ファイルとしてまと め 複 数 の vol ファイ ルを 作 成 します 5 変 換 ボタン 変 換 を 実 行 します 6 ステータスバー 作 業 の 進 行 状 態 などが 表 示 されます 4
出 力 ファイル 名 規 則 出 力 されるファイル 名 には 以 下 の 規 則 が 存 在 します.raw ファイル 出 力 の 場 合 元 のDICOM ファイルと 同 数 の.raw ファイルが 作 成 されます この 時 ファイル 名 は ファイル 名 + 4 桁 の 番 号 +.raw の 形 式 をとります この 例 では result0001.raw ~ result0100.raw ~ が 出 力 されま す vif / vol 出 力 ( 分 割 )の 場 合 DICOM 画 像 のスライス 間 隔 が 大 きい 箇 所 が 1 カ 所 の 場 合 vif/vol ファイルは 各 2 つず つ 作 成 されます この 時 ファイル 名 は ファイル 名 + _ 番 号 +.vif の 形 式 をとります この 例 では result_1.vif, result_2.vif が 出 力 されます vif / vol 出 力 ( 標 準 ) 及 び 穴 埋 めモードでは ファイル 名 は 以 下 の 規 則 で 決 定 します ファイル 名 +.vif 5
付 録 Volume Extractor で 使 用 している3 次 元 画 像 のファイルフォーマットについて 説 明 し ます 1.ファイルフォーマット 1.1.VDF フォーマット Volume Extractor 用 のファイルフォーマットです ファイル 情 報 [256byte] 画 像 データ (Raw 形 式 ) ( 縦 x 横 x 高 x 単 位 データサイズ) ファイル 情 報 先 頭 の 256byte にはファイル 情 報 として 下 記 の 情 報 が ASCII で 格 納 されます 各 項 目 は スペース(0x20)で 区 切 られ 格 納 されます 項 目 内 容 ファイルヘッダ VDF_1.0_VE12.8 StartPoint( 描 画 開 始 位 置 ) sp タグ 開 始 位 置 X 座 標 数 値 ( 実 数 ) 開 始 位 置 Y 座 標 数 値 ( 実 数 ) 開 始 位 置 Z 座 標 数 値 ( 実 数 ) グリッドサイズタグ n X 軸 サイズ 数 値 ( 整 数 ) ファイル 情 報 Y 軸 サイズ 数 値 ( 整 数 ) [256byte] Z 軸 サイズ 数 値 ( 整 数 ) ピッチサイズタグ pitch X 方 向 Pitch 数 値 ( 実 数 ) Y 方 向 Pitch 数 値 ( 実 数 ) Z 方 向 Pitch 数 値 ( 実 数 ) データタイプタグ dt データタイプ(1~4) 数 値 (1~4) 情 報 終 了 識 別 子 \n(0x0a) ( 予 備 ) 0x00 6
ファイルヘッダ 文 字 列 VDF_1.0_VE12.8 固 定 StartPoint 3D 空 間 上 での 配 置 位 置 の 指 定 右 図 のようにモデルの 3D 空 間 上 での 開 始 点 を 指 定 します グリッドサイズ X 軸 Y 軸 Z 軸 各 方 向 のピクセル(ボクセル) 数 のサイズ データタイプ 1ピクセル(ボクセル)のデータで 使 用 されるデータの 型 1 : Byte 型 (1byte) 2 : Unsigned Short 型 (2byte) 3 : Short 型 (2byte) 4 : int 型 (4byte) 情 報 終 了 識 別 子 ファイル 情 報 の 最 後 に \n (0x0A)を 格 納 ( 予 備 ) この 部 分 は 今 後 の 拡 張 等 のための 箇 所 として 用 意 されています 0x00 で 埋 めます 7
画 像 データ 画 像 データが RAW 形 式 で 格 納 されます 各 データ 要 素 は データタイプ で 指 定 されたサイズになり データ 全 体 としては 下 記 の サイズになります (グリッド X 軸 サイズ) (グリッド Y 軸 サイズ) (グリッド Z 軸 サイズ) (データタイプの 指 定 byte 数 ) 格 納 順 序 は X 軸 方 向 の 要 素 から 格 納 開 始 され Y 軸 方 向 Z 軸 方 向 へと 格 納 されています ( 右 図 イメージ 参 照 ) X 軸 方 向 Y 軸 方 向 Z 軸 方 向 VE での 表 示 は Z 軸 方 向 を 上 向 きにしていますのでご 注 意 下 さい 8
1.2.VOL フォーマット 拡 張 子 vol と vif の 2 つのファイルにより 構 成 されたボリュームデータファイル です vif がファイル 情 報 部 分 vol が 画 像 データ 部 分 となります vif vif ファイルにはファイル 情 報 として 下 記 の 内 容 が ASCII として 5 行 構 成 で 格 納 されます ( 改 行 コードは r n(0x0d0a)) 行 数 項 目 記 述 内 容 1 ファイルヘッダ 文 字 列 VIF 1.0 VE12.8 2 StartPoint start_pt [X 座 標 ] [Y 座 標 ] [Z 座 標 ] 3 画 像 (グリッド)サイズ size [X 方 向 ] [Y 方 向 ] [Z 方 向 ] 4 各 方 向 のピッチ pitch [X 方 向 ] [Y 方 向 ] [Z 方 向 ] 5 データタイプ data_type [1~4] 2 行 目 以 降 の 各 項 目 は 内 容 を 示 す 文 字 列 ( start_pt 等 )が 記 述 され 続 けて 値 ( 数 値 )が 格 納 されます 文 字 列 と 値 の 間 は 半 角 スペース(0x20)2 文 字 分 で 区 切 り 各 値 ( 数 値 )の 間 は 半 角 スペ ース 1 文 字 分 で 区 切 ります 例 VIF 1.0 VE12.8 start_pt -0.5-0.5-0.5 size 512 512 469 pitch 0.1693333 0.1693333 0.64 data_type 2 vdf 画 像 データ 要 素 が RAW 形 式 で 格 納 されます 格 納 されるデータのサイズ 順 序 等 は VDF のデータ 部 分 と 同 じです (VDF フォーマット 参 照 ) 9
2. 出 力 サンプルコード VDF VOL VIF の 出 力 サンプルコードを 下 記 に 記 します エラー 処 理 等 は 考 慮 されていませんので ご 注 意 下 さい /// /// Raw データの 書 き 出 し /// 下 記 のメソッド 内 で 使 用 します /// private: bool SaveRAW(BinaryWriter^ bw, array<unsigned char>^ data){ // Raw データ 書 き 出 し int count = 0; while(count < data->length){ bw->write(data[count]); count++; } return true; } /// /// VOL ファイルの 書 き 出 し /// private: bool SaveVOL( String^ path, // 出 力 先 のファイルパス array<unsigned char>^ data // 出 力 元 データ(1 次 元 配 列 のボリュームデー タ) ){ // VOL 書 き 出 し FileStream^ fs = gcnew FileStream( path, System::IO::FileMode::Create, System::IO::FileAccess::Write, System::IO::FileShare::None); BinaryWriter^ bw = gcnew BinaryWriter(fs); // VOL ファイルは 実 際 のところ Raw データそのもの SaveRAW(bw, data); bw->close(); fs->close(); } return true; 10
/// /// VIF ファイルの 書 き 出 し /// private: bool SaveVIF( String^ path, // 出 力 先 のファイルパス int x, int y, int z, // データグリッドサイズ double spx, double spy, double spz, // データ 開 始 位 置 double ptx, double pty, double ptz // データピッチ ){ // VIF 書 き 出 し FileStream^ fs = gcnew FileStream( path, System::IO::FileMode::Create, System::IO::FileAccess::Write, System::IO::FileShare::None); StreamWriter^ sw = gcnew StreamWriter(fs); String^ tmpstr = L""; sw->newline = L"\r\n"; // 改 行 コード // 全 部 で 5 行 // 1 行 目 sw->writeline(l"vif 1.0 VE12.8"); // 2 行 目 tmpstr = L"start_pt " + spx.tostring() + L" " + spy.tostring() + L" " + spz.tostring(); sw->writeline(tmpstr); // 3 行 目 tmpstr = L"size " + x.tostring() + L" " + y.tostring() + L" " + z.tostring(); sw->writeline(tmpstr); // 4 行 目 tmpstr = L"pitch " + ptx.tostring() + L" " + pty.tostring() + L" " + ptz.tostring(); sw->writeline(tmpstr); // 5 行 目 tmpstr = L"data_type " + L"1"; // サンプルでは unsigned char 型 に 固 定 sw->writeline(tmpstr); sw->close(); fs->close(); } return true; 11
/// /// VDF ファイルの 書 き 出 し /// private: bool SaveVDF( String^ path, // 出 力 先 のファイルパス int x, int y, int z, // データグリッドサイズ double spx, double spy, double spz, // データ 開 始 位 置 double ptx, double pty,double ptz, // データピッチ array<unsigned char>^ data // 出 力 元 データ(1 次 元 配 列 のボリュームデー タ) ){ // VDF 書 き 出 し FileStream^ fs = gcnew FileStream( path, System::IO::FileMode::Create, System::IO::FileAccess::Write, System::IO::FileShare::None); BinaryWriter^ bw = gcnew BinaryWriter(fs); // ヘッダ 文 字 列 unsigned char 型 の 例 (データタイプ=1 ヘッダ 長 さは 256 固 定 ) String^ str_header = L"VDF_1.0_VE12.8" + " sp " + spx.tostring() + " " + spy.tostring() + " " + spz.tostring() + " n " + x.tostring() + " " + y.tostring() + " " + z.tostring() + " pitch " + ptx.tostring() + " " + pty.tostring() + " " + ptz.tostring() + " dt " + "1" + "\n"; // String を Char クラス 配 列 に 変 換 array<char>^ transfer_header = str_header->tochararray(); // 実 際 に 書 き 出 す Char クラス 配 列 array<char>^ put_header_array = gcnew array<char>(256); // 書 き 出 しに 使 用 する 配 列 に データを 転 送 Array::Copy(transfer_header, put_header_array, transfer_header->length); // 未 使 用 列 は 0 で 埋 める int count = transfer_header->length; while(count < 256){ put_header_array[count] = 0; count++; } // ヘッダを 書 き 出 す count = 0; while(count < 256){ bw->write(put_header_array[count]); count++; } // データ 部 分 を 書 き 出 す データ 部 は Raw データと 同 じ SaveRAW(bw, data); bw->close(); fs->close(); 12
} return true; 13
14
DICOM 画 像 変 換 ツールマニュアル 2010 年 6 月 10 日 第 1.0 版 発 行 製 作 著 作 株 式 会 社 i-plants Systems info@i-plants.jp ve_support@i-plants.jp(ve サポート 専 用 窓 口 ) 019 694 3103( 代 表 ) http://www.i-plants.jp/hp 15