C++によるDICOMファイル解析
■ このスレッドは過去ログ倉庫に格納されています
>>2 DICOMとは Digital Imaging and Communications in Medicineの略で、 医療におけるデジタル画像と通信の企画を定めたやつです。 ものすごーく複雑多岐に及んでいてとても個人で全て 理解できる代物ではないので、ひとまずDICOMファイルを 読み込んでデータを解析するくらいのものを作ってみようかと >>3 DAICON DICOMファイルのサンプル(グロ画像ではありません) http://149.142.216.30/DICOM_FILES/DICOMfilesIndex.html >>7 フリーのDICOMファイル解析ツールってのが Macを除いて殆ど無いので、ショボいのでもいいから作ってみようかと ちなみにMacではApple社がMac OS X用に開発した 無料DICOMビューア「OsiriX」(オシリックス?)というのがあります 凄すぎ http://www.apple.com/jp/medical/osirix/ ココまでのモノを作り上げるのは到底不可能ですが、 できるトコまでやってみたいと思っとります 「解析ツール」が何を指しているのかよくわからんが、ビューア系なら色々あるぞ。 ttp://www.vector.co.jp/soft/winnt/business/se333639.html ttp://www.vector.co.jp/soft/winnt/business/se388642.html ttp://www.vector.co.jp/soft/win95/business/se332625.html 洋物もいくつか使ったことある。 >>10 情報Thx! ただ、ソースコード公開してるトコは見た事なかったので、 自己の勉強の意味でも作ってみよーかなと 「解析ツール」って言ったのは DICOMヘッダ情報解析&画像閲覧できる Appを指してます ほんじゃそろそろDICOMファイルの 詳細な構造から行ってみます ■DICOMファイルは大きく分けて以下の構造になってます ┌───────────── |DICOMファイルメタ情報 ├───────────── |DICOMデータ集合 └───────────── まずDICOMファイルメタ情報から見ていきます 【DICOMファイルメタ情報】 DICOMファイルを構成する為の ヘッダ情報みたいなものが入っています 具体的には以下構成になっています ■DICOMファイルメタ情報の構造 ┌───────────── |ファイルプリアンブル ├───────────── |DICOMプリフィックス ├───────────── |ファイルメタ要素 ├───────────── |ファイルメタ要素 ├───────────── |ファイルメタ要素 ├───────────── |・・・・・・・・・ ├───────────── |ファイルメタ要素 └───────────── 【ファイルプリアンブル】 DICOMファイル先頭にある固定128バイト。 アプリケーション特定の用途により使用できるようになっています。 使用しない場合は、全てのバイトに0x00を設定するよう決められています。 【DICOMプリフィックス】 4バイトの文字列。「DICM」固定。 このファイルがDICOMファイルかどうか判断する為に使用されます。 【ファイルメタ要素】 DICOMファイルのヘッダ情報を表す項目。 それぞれ『タグ』、『値表現(VR)』、『値長さ』、『値領域』で構成されています(※)。 ※詳細は後述。 >>1 はなぜDICOMのファイルを解析したいのか、その動機を具体的に書け。 詳細な解説は飛ばして、次にDICOMデータ集合に行きます 【DICOMデータ集合】 DICOMファイルの最も重要な部分。 ・画像情報(画像の幅、高さ.etc) ・患者情報(患者名、年齢、住所.etc) 等、ありとあらゆるデータが詰め込まれています。 ■DICOMデータ集合の構造 ┌───────────── |データ要素 ├───────────── |データ要素 ├───────────── |データ要素 ├───────────── |・・・・・・・・・ ├───────────── |データ要素 └───────────── 【データ要素】 DICOMファイルの各データを表す項目。 それぞれ《基本的に》『タグ』、『値表現(VR)』、『値長さ』、『値領域』で構成されています(※)。 ※詳細は後述。 解析する「ソフトを作りたい」動機じゃないぞ。「解析したい動機」だ。 仕事で必要になったんだが、金が無いので、無料で馬鹿どもを集めて作らせようという魂胆でしょ。 仕様通りに実装して終了 の気がするんだけど 仕様が巨大らしいから面倒なのかな >>17 ・C++のお勉強 ・DICOM規格のお勉強(最初はDICOM解説サイト作ろうとしたけどメンドいのでやめた) ってトコかな 別にDICOMじゃなくてもいいんですよ やり甲斐がある題材が欲しかっただけ >>18 いや、仕事とは無関係ですよ 完全に趣味 $ apt-cache search DICOM libdcmtk0 - The OFFIS DICOM toolkit runtime libraries libdcmtk0-dev - The OFFIS DICOM toolkit development libraries and headers ctn - Central Test Node, a DICOM implementation for medical imaging ctn-dev - Development files for Central Test Node, a DICOM implementation ctn-doc - Documentation for Central Test Node, a DICOM implementation dcmtk - The OFFIS DICOM toolkit command line utilities dcmtk-doc - The OFFIS DICOM toolkit documentation dcmtk-www - The OFFIS DICOM toolkit worklist www server application libdcmtk1 - The OFFIS DICOM toolkit runtime libraries libdcmtk1-dev - The OFFIS DICOM toolkit development libraries and headers libmdc2 - Medical Image (DICOM, ECAT, ...) conversion tool libmdc2-dev - Medical Image (DICOM, ECAT, ...) conversion tool medcon - Medical Image (DICOM, ECAT, ...) conversion tool xmedcon - Medical Image (DICOM, ECAT, ...) conversion tool 結構ヒットするよ Debianだからフリーだよ DCMTK使えよ。 ttp://dicom.offis.de/dcmtk.php.en スレ主はちゃんと調べもせずに「ない」と決め付けている。 >>20 なぜDICOM規格の勉強をしたいのか説明しろ >>1 ツール作りたいなら、別に規格の説明などしなくていいから、勝手に自分でやってくれ。 やるならYAMLだな。 いいものが出来れば、社会に貢献できる。 ただいま戻りました あ、情報提供有難うございます。 是非参考にさせてもらいます >>16 の続き 眠いのでこれだけ・・・ 【タグ】 16ビット符号無し整数の「グループ番号」「要素番号」の対で構成され、 データ要素を一意に識別する(例外有り)為の目印。 規格書には(0x0020,0x1011)等と記載されたりします。 【値表現(VR)】 データ要素の値のデータタイプ及び書式を表す2バイトの文字列。 データ要素が持つ値は文字列だったり整数値だったりバイト列だったりしますが、 これらのデータタイプが何なのかを解析する際に使用されます。 DICOMファイルによっては、このVRが存在しない(暗黙的VR)ものもあります。 【値長さ】 値領域の長さ(バイト数)を示す16または32ビット (VRが明示的か暗黙的かに依存する)符号無し整数。 値長さが未定義の場合、このフィールドには 0xFFFFFFFFが設定されます(未定義長さ)。 【値領域】 データ要素の値が格納されている領域。 値が整数値なのか文字列なのかはVRによって判断されます。 とりあえず物凄く大まかな構造を解説したところで、 これまでの解説をプログラムでまとめてみましょう int main(int argc, char* argv[]) { DicomFile DcmFile; // DICOMファイルを解析するクラスのインスタンス DcmFile.Open(argv[1]); DcmFile.ReadMetaInfo() ; DcmFile.ReadDataSet() ; return 0; } DicomFileクラスはコメントにもある通り DICOMファイルを読み込み、データを解析するクラスです 直感的に見て分かると思いますが上のプログラムでは ・DICOMファイルをオープンする ・DICOMファイルメタ情報を読み込んで解析する ・DICOMデータ集合を読み込んで解析する の3つを行います 解析した結果をどうするかについてはまた別途考えます /* 「解析する」ならRead〜じゃなくてParse〜の方が良かったか・・・ */ はじめから隔離スレだし、他で暴れられるよりいいじゃね? いやー本業多忙で・・・ もうしばらく延期させてください >>54 まぁそう言わず これですか? わかりません :D ttp://www.youtube.com/watch?v=a6ErJVffY6E&mode=related&search= おれも、前に作ったが、iso-2022系の文字をサポートしているためハングルとか中国語とか 文字で死にそうだった。後は楽な仕様だが、規格が大きいので関係ないところを読み飛ばさないとつらい。 >>32 の続き まずはDICOMファイルを全てメモリに読み込んでみます (最大メモリ量 > ファイルサイズ の前提で話を進めます) ---------------------------------------- #include <fstream> using namespace std; class DicomFile { private: unsigned char* m_pFile; unsigned char* m_pCur; unsigned char* m_pEnd; public: // コンストラクタ DicomFile() : m_pFile(NULL) , m_pCur(NULL) , m_pEnd(NULL) { } // DICOMファイルをオープンする int Open(char* pFileName) { ifstream file; long lLength = 0; file.open(pFileName, ios::binary); file.seekg(0, ios::end); lLength = file.tellg(); file.seekg(0, ios::beg); m_pFile = new unsigned char[lLength]; file.read((char*)m_pFile, lLength); file.close(); m_pEnd = m_pFile + lLength; m_pCur = m_pFile + 128; if (memcmp(m_pCur, "DICM", 4) != 0) { delete [] m_pFile; m_pFile = NULL; m_pEnd = NULL; m_pCur = NULL; return 0; } m_pCur += 4; return 1; } // メタ情報を解析する int ParseMetaInfo() { return 1; } // データ集合を解析する int ParseDataSet() { return 1; } }; int main(int argc, char* argv[]) { DicomFile DcmFile; // DICOMファイルを解析するクラスのインスタンス DcmFile.Open(argv[1]); DcmFile.ParseMetaInfo(); DcmFile.ParseDataSet(); return 0; } 色々と突っ込みどころ満載なのはご愛嬌。 今日はおちまい。 久々に再開するかーと思ったけど、 どこかwebスペースを借りてやった方が良いですかね。。 書込行数も制限されちゃうし >>72 ありがとうございます web借りました。 今後はこっちで細々やっていきます。 板汚しすみませんでした。 http://s1.muryo-de.etowns.net/ ~programming/ すみません。。HDDがいきなり死亡して ソースが全部吹っ飛んでしまいました。。 もうしばらくお待ち下さい。。 あの、すいません。 バイトでちょうどDICOMに関することをやらされているので、このスレ見つけて感動しました。 ところで、ちょうどというか本当にちょうどあなたがサイトでやられているようなことをやってくれないかと支持されたのですが もしよろしければソースコード公開とかされないでしょうか? あっはっは(苦笑 いちおうリアルゆとり世代ではないのですが・・・ いちおう、ゆとりなりに努力した結果、一昨日に完成させました。 バイト先に出す成果物なのでソースコードが出せませんが・・・ でも、毎年追加変更あるんだよね。 俺がやったときは対応する文字コードが多すぎて面倒だったな。 ところで http://www.jfcr.or.jp/DICOM/dicom_draft-j.html とかの、DICOM仕様書の日本語訳とかが消えているっぽいんだけど 他に日本語約手に入るところ知らないかな? この分量の英語読むのは正直辛い CベースのDICOM画像読み込みライブラリ、Windows、Mac、Linux対応 DICOMの通信規格部分は非対応。 Mac用のOsirisXなんかに使われているのが実績 http://japanese.osstrans.net/software/osirix.html 画像の読み出しだけなら十分に便利。 >>85 試しにテスト画像みたいなのをSCION IMAGEで開こうとしたけど… 自分じゃやり方が良くわからん。 DICOM画像ってのは簡単に作れるもんなんでしょうか? 詳しくは知らんが画像そのものはTIFFとかだったような記憶がある。 画像とその付帯情報、医療用なので患者の情報とかが、 いろいろくっついていてポータブル形式というのにパッケージされている。 業界標準的なライブラリはあったと思う。 ビューワー程度だったら医学生が自作できる程度のものらしい。 特定分野の技術だから情報が仕入れにくいのがネックかもしれない。 名古屋大学のDICOMViewerでどれでも読めるわけじゃないよ タグ編集画面の説明は丁寧だけど SQタグとかは対応してないけどバイナリでエクスポートはできる >ビューワー は沢山あるんだけど、 ファイル作成ライブラリが無いような気がするのは気のせい? 基本的にDICOMはJPEGに患者なの名前などのタグを入れ込めるようにしたものですね。 ただ、wikipediaにも同じ内容があるのですが、標準仕様が改定のたびに膨大になっていること。 あと、医療機器メーカーなんかがCTスキャンの画像を独自拡張した使用で吐き出したりすることがままあるので、きちんとすべてのDICOM画像を表示できるものは限られているみたいですよ。 ファイル作成ライブラリが無いのは基本的に医療機器側でDICOMデータとして吐き出してくれるから。 間違いあったらごめんなさい。 情報thx! 機器側の中の人はどうやって作られてるんでしょ? DICOMファイルのフォーマットさえ理解できていれば、あとは規格書を見て黙々と必要な情報を出力するだけ。 厳密に運用するなら出力する内容と規格との適合性のチェックが大変なだけで、 ファイルフォーマット自体は>>12-16 に挙げられているように単純なものですよ。 >>95 画像部分については、基本的に無圧縮データです。 ただ、何でも受け入れちゃうDICOMだから非可逆/可逆をあわせてJPEGも可能ですけど。 規格上の画像形式はPart.5を参照のこと。 また、画像の表示に関しては画像と通信の規格なんですから、基本的に表示できて当たり前です。 でないと、わざわざ規格を定めている意味がありません。 CTで吐き出されたDICOM画像のヘッダを自作のRAWやTIF画像のヘッダに載せ替え,デジタルファントムの作成を企てていますが,うまくいきません。 どうやればうまくいくんでしょう? 意外とライブラリ多いんだな ttp://mist.suenaga.cse.nagoya-u.ac.jp/document/group__dicom__group.html どれ使えばいいんだかわからん >>19 仕様に自由度があってメーカーごとにグチャグチャ そこらのDICOMファイルの構造をみまくったんだけど、 DICOMのファイルメタなんとか(すなわち、一番目のタグが0002のやつ)って、 Explicit VRで決まってるんだっけ? 俺の見たDICOMファイルって全部そうだったんだけど。 で、それって、仕様書でどっかに明記されてるっけ? >105 ftp://medical.nema.org/medical/Dicom/2008/08_10pu.pdf 22ページに書いてるよ the File Meta Information shall be encoded using the Explicit VR Little Endian Transfer Syntax (UID=1.2.840.10008.1.2.1) as defined in DICOM PS 3.5. >>106 さんきゅー そのページ精読してみますよ ここの「プログラミングの部屋」に、DICOMに関する記述がありますた。 ttp://www7.plala.or.jp/nekogrammer/ ただ、C++ではなく、Cでビュワーを作っているんですよね。 プログラムもあんまりきれいではないようだし、どうなんでしょうかね? >>109 フリーのツールは探せばいろいろあるよ 専用ツール使わなくてもMATLABとかOctaveとかVTKで足りるんじゃない? むかしMRIの造影シミュレーションやったことあるけどどれ使ったかわすれたゃった 研究で必要なら適当にそのへんでggって >>111 つか、あの日本語訳作った奴の顔を見てみたいよな。 日本語訳がひどすぎて、結局英語版読まないとだめだ。 NEMAのサイトで落とせるのが正式な規格書って聞いたんだが、 無くなってるだよね。 ttp://www.dclunie.com/dicom-status/status.html ここにある奴が正式版って事でいいのか? (結局はDICOM Homepageの奴だが) ちょっとスレ違いですみません。 OsiriXの最初から今に至るまでMAC版だけで、 Windows版なんて出た事ないですよね? その前身のosirisだけですよね、 色んなプラットフォームで出てたのは。 溜飲が下りました。 ありがとうございます。 どうやら自演が過ぎて分裂症ぎみのようだな。 いるはずがないのは分かっていたことだ。 このスレ立ってから4、5年経つのに120レス前後か… DICOMは興味持ってる人意外と多そうだが参考資料が殆ど英語なのがきつい 大体何から始めたらいいものやら 操作の仕方を覚えてしまったらいちいちこのスレ見なくなるからじゃね? 随分前の話だがOsiriXとiPad使って3DCT見ながら手術ってのがあったな OsiriXって事は全部自前で用意したんかなぁ… あそこまで行かなくても何か簡単なソフトくらい作ってみたいもんだ それにしても、日本語版より英語原文読んだ方がわかりやすいって 一体どんな酷い翻訳プロジェクトだよな全く あれって多分、機械翻訳通しただけだろ? >>125 高額な医療機器しかはきださないようなデータフォーマットに興味がある人間がそれほどいるとは思えない。 いたとしても医療関係者ぐらいでニーズは医療ミスを隠蔽する目的でのデータの改竄ぐらいじゃないか。 医者だったらソフトを買う金に不自由はしないだろう。 一般人はそもそもDICOMファイルを簡単に入手できないんだよ。 自分のMRI画像ですらコピーするだけで病院は金を取るのさ。 こことかかな ttp://pubimage.hcuge.ch:8080/ 圧縮されてるみたいでImageJじゃ開けなかったが つか、シーメンス製機器端末が吐き出すDICOMが プライベートタグ使いまくりで泣けた おかげで他で撮ったDICOMがなかなかシーメンスの端末で読めない 若いなぁ でもどっかの先生がソフト作って公開してるって見た事はあるな DICOMと関係ないけどAccess使ってダイナミクス?だったか 医師側からは既存のソフトウェアって物足りないんだろうか 知らなかった… ttp://ja.wikipedia.org/wiki/%E5%90%89%E5%B4%8E%E6%A0%84%E6%B3%B0 >吉崎 栄泰(よしざき はるやす、1955年2月23日 - )は、日本の医師、プログラマ。 今の時代だったら若い先生とか普通にPCに詳しいんだろうな あと有名どころだと、芸夢狂人とかな。 たしかどこかの放射線科医だろ。 俺もこの人に影響受けて大学の放射線科に残っとるよ。 いつの間にかDCMTKが3.6.0になっていた ttp://dicom.offis.de/dcmtk.php.en dat落ち寸前のスレッドで忍法 誰か、書き込みしてー あらよっと! こんな糞スレでも愛着が沸いてきたー 保守してやんよ 1000行くまでは俺様以外書き込みするんじゃねーぞ ファイルフォーマットよりも通信規格がわからん・・・。 >>135 モダリティメーカーでプログラム組んでた俺がぶっちゃけると、DICOMタグが多すぎて、 全部把握できずに、とりあえずプライベートタグで対応しまくり。 あとから標準タグでも行けたと知っても時既に遅しってパターンがほとんど。 >>160 TOTOKU (東京特殊電線) - サブピクセル製品を真っ先に出したが。 が。の後が気になるw struct _endian{ union{ short s; char c[2]; } u; } endian_test = {0x55AA}; bool is_little_endian = (endian_test.u.c[0] == 0x55); DICOM通信意味不明すぎるだろ 日本語の噛み砕いた資料ないの? >>173 そうなのか? OSIの基本を知ってさえいれば、難易度の低いAP層プロトコルだろ 量が大きいから全体を理解/把握するのは大変かもしれないけど、 それは技術的な問題では無いし、意味不明でもない そりゃそうだw HTTPのプロトコル仕様を知っている人は多いと思うけど、 実際に実装できるプログラマは少ない たとえ作れる人でも、普通は既存のライブラリを利用する DICOM通信は、PDU仕様がLDAPやX.509みたいに OSI標準のASN.1で定義されていれば専用のコンパイラがあるから 少しは実装が楽になったと思うけど、 独自の仕様で定義されている点が残念なところ 一番の問題点は仕様がアホみたいに巨大かつ肥大化を続けてることだろう HTTP実装はまた流行るよ。 VPSが安くなってきたから。 レンタルサーバが安くなってくると同時にLinuxが流行ったのと同じ感じ。 長文pdf作るより標準ライブラリ作って配布した方がいいと思うの・・・ 仕様が膨大&複雑すぎて、肝心のデータの受け渡しでトラブル起こりまくりだよね。DICOMって。 ばかげてる。 3Dプリンタで模擬の臓器や骨を作りたいんだけども、DICOMって座標情報に対応してる? voxelから無理矢理変換して、さらに影とかを修正するしか無いのかな・・・? 零点をどこに合わせるかは撮影者の腕次第だが スライス間隔とピクセルの大きさがタグに書かれているから そこから座標を構築できる 詳しくはPDF読め 注意点 撮影方法によってはスライスが重なっていたり飛び飛びになっている CTではthin sliceデータを自分で再構成するより モダリティで再構成したほうがノイズの少ないものができる機種がある (仕掛けは非公開だが内部に持っているraw dataを利用している?) >>184 他の規格でもそうだが 情報交換することを優先するなら 解釈の差が生まれないように規格を設計すべきだし 平均的労働者が短時間で理解できる仕様を構成すべきなんだが 実際に起きているトラブルはそんなところじゃなくて あり得る可能性の重みを無視して実装を省略した結果起きている ことがまれによくある セントリシティが吐いたデータを他で読めないのとかは そんな感じじゃないか? >>186 いちおー座標による3Dにも対応してるのね、ありがとう PDFが厚すぎて、読む気にもなれんのよ・・・w 結局EXIFみたいなファイル、ディレクトリ構造なんだからまず基本データ型のデコードメソッド作って その構造エントリ名含めて丸ごとXMLに吐き出させて外部ツールで解析、統計分析等したらいいのに 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 W85R2 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる