5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++によるDICOMファイル解析

1 :デフォルトの名無しさん:2006/08/21(月) 21:49:44
さっそくはじめましょー

2 :デフォルトの名無しさん:2006/08/21(月) 21:51:32
DICOMの紹介をどうぞ

3 :デフォルトの名無しさん:2006/08/21(月) 21:56:40
あ〜、あの電車男のオープニングの元ネタの

4 :デフォルトの名無しさん:2006/08/21(月) 21:59:50
>>2
DICOMとは

Digital Imaging and Communications in Medicineの略で、
医療におけるデジタル画像と通信の企画を定めたやつです。
ものすごーく複雑多岐に及んでいてとても個人で全て
理解できる代物ではないので、ひとまずDICOMファイルを
読み込んでデータを解析するくらいのものを作ってみようかと

>>3
DAICON

5 :デフォルトの名無しさん:2006/08/21(月) 22:15:52
参照URLも貼らずに(ry

6 :デフォルトの名無しさん:2006/08/21(月) 22:20:21
参考URL:

DICOM日本語Webページ
http://www.jfcr.or.jp/DICOM/

本家
http://medical.nema.org/

7 :デフォルトの名無しさん:2006/08/21(月) 22:25:54
規格が決まってるなら別に解析する必要なくね?

8 :デフォルトの名無しさん:2006/08/21(月) 22:35:46
DICOMファイルのサンプル(グロ画像ではありません)
http://149.142.216.30/DICOM_FILES/DICOMfilesIndex.html

>>7
フリーのDICOMファイル解析ツールってのが
Macを除いて殆ど無いので、ショボいのでもいいから作ってみようかと

9 :デフォルトの名無しさん:2006/08/21(月) 22:46:19
ちなみにMacではApple社がMac OS X用に開発した
無料DICOMビューア「OsiriX」(オシリックス?)というのがあります 凄すぎ
http://www.apple.com/jp/medical/osirix/

ココまでのモノを作り上げるのは到底不可能ですが、
できるトコまでやってみたいと思っとります

10 :デフォルトの名無しさん:2006/08/21(月) 22:47:07
「解析ツール」が何を指しているのかよくわからんが、ビューア系なら色々あるぞ。
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

洋物もいくつか使ったことある。


11 :デフォルトの名無しさん:2006/08/21(月) 22:56:43
>>10
情報Thx!
ただ、ソースコード公開してるトコは見た事なかったので、
自己の勉強の意味でも作ってみよーかなと

「解析ツール」って言ったのは
DICOMヘッダ情報解析&画像閲覧できる
Appを指してます

12 :デフォルトの名無しさん:2006/08/21(月) 23:07:29
ほんじゃそろそろDICOMファイルの
詳細な構造から行ってみます

■DICOMファイルは大きく分けて以下の構造になってます
┌─────────────
|DICOMファイルメタ情報
├─────────────
|DICOMデータ集合
└─────────────

まずDICOMファイルメタ情報から見ていきます

13 :デフォルトの名無しさん:2006/08/21(月) 23:47:00
【DICOMファイルメタ情報】
DICOMファイルを構成する為の
ヘッダ情報みたいなものが入っています

具体的には以下構成になっています

■DICOMファイルメタ情報の構造
┌─────────────
|ファイルプリアンブル
├─────────────
|DICOMプリフィックス
├─────────────
|ファイルメタ要素
├─────────────
|ファイルメタ要素
├─────────────
|ファイルメタ要素
├─────────────
|・・・・・・・・・
├─────────────
|ファイルメタ要素
└─────────────

14 :デフォルトの名無しさん:2006/08/22(火) 00:05:30
【ファイルプリアンブル】
DICOMファイル先頭にある固定128バイト。
アプリケーション特定の用途により使用できるようになっています。
使用しない場合は、全てのバイトに0x00を設定するよう決められています。

【DICOMプリフィックス】
4バイトの文字列。「DICM」固定。
このファイルがDICOMファイルかどうか判断する為に使用されます。

【ファイルメタ要素】
DICOMファイルのヘッダ情報を表す項目。
それぞれ『タグ』、『値表現(VR)』、『値長さ』、『値領域』で構成されています(※)。

※詳細は後述。

15 :デフォルトの名無しさん:2006/08/22(火) 00:30:03
>>1はなぜDICOMのファイルを解析したいのか、その動機を具体的に書け。

16 :デフォルトの名無しさん:2006/08/22(火) 00:30:27
詳細な解説は飛ばして、次にDICOMデータ集合に行きます

【DICOMデータ集合】
DICOMファイルの最も重要な部分。
・画像情報(画像の幅、高さ.etc)
・患者情報(患者名、年齢、住所.etc)
等、ありとあらゆるデータが詰め込まれています。

■DICOMデータ集合の構造
┌─────────────
|データ要素
├─────────────
|データ要素
├─────────────
|データ要素
├─────────────
|・・・・・・・・・
├─────────────
|データ要素
└─────────────

【データ要素】
DICOMファイルの各データを表す項目。
それぞれ《基本的に》『タグ』、『値表現(VR)』、『値長さ』、『値領域』で構成されています(※)。

※詳細は後述。

17 :デフォルトの名無しさん:2006/08/22(火) 00:30:56
解析する「ソフトを作りたい」動機じゃないぞ。「解析したい動機」だ。

18 :デフォルトの名無しさん:2006/08/22(火) 00:32:07
仕事で必要になったんだが、金が無いので、無料で馬鹿どもを集めて作らせようという魂胆でしょ。

19 :デフォルトの名無しさん:2006/08/22(火) 00:34:54
仕様通りに実装して終了

の気がするんだけど

仕様が巨大らしいから面倒なのかな

20 :デフォルトの名無しさん:2006/08/22(火) 00:44:01
>>17
・C++のお勉強
・DICOM規格のお勉強(最初はDICOM解説サイト作ろうとしたけどメンドいのでやめた)
ってトコかな

別にDICOMじゃなくてもいいんですよ
やり甲斐がある題材が欲しかっただけ

>>18
いや、仕事とは無関係ですよ 完全に趣味

21 :デフォルトの名無しさん:2006/08/22(火) 00:45:56
って、明日も仕事なので
今日はコレくらいで
では

22 :デフォルトの名無しさん:2006/08/22(火) 00:49:46
$ 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だからフリーだよ


23 :デフォルトの名無しさん:2006/08/22(火) 11:33:11
DCMTK使えよ。
ttp://dicom.offis.de/dcmtk.php.en

スレ主はちゃんと調べもせずに「ない」と決め付けている。

24 :デフォルトの名無しさん:2006/08/22(火) 11:53:11
>>20
なぜDICOM規格の勉強をしたいのか説明しろ

25 :デフォルトの名無しさん:2006/08/22(火) 12:10:17
あんな糞企画、仕事以外で使いたくなるわけ無い

26 :デフォルトの名無しさん:2006/08/22(火) 12:16:51
>>1
ツール作りたいなら、別に規格の説明などしなくていいから、勝手に自分でやってくれ。

27 :デフォルトの名無しさん:2006/08/22(火) 19:42:12
そんな規格よりXMLSchemaとか解析してくれ

28 :デフォルトの名無しさん:2006/08/22(火) 19:45:16
やるならYAMLだな。
いいものが出来れば、社会に貢献できる。

29 :デフォルトの名無しさん:2006/08/22(火) 23:33:35
ただいま戻りました

あ、情報提供有難うございます。
是非参考にさせてもらいます

30 :デフォルトの名無しさん:2006/08/23(水) 00:17:11
>>16の続き
眠いのでこれだけ・・・

【タグ】
16ビット符号無し整数の「グループ番号」「要素番号」の対で構成され、
データ要素を一意に識別する(例外有り)為の目印。
規格書には(0x0020,0x1011)等と記載されたりします。

【値表現(VR)】
データ要素の値のデータタイプ及び書式を表す2バイトの文字列。
データ要素が持つ値は文字列だったり整数値だったりバイト列だったりしますが、
これらのデータタイプが何なのかを解析する際に使用されます。
DICOMファイルによっては、このVRが存在しない(暗黙的VR)ものもあります。

【値長さ】
値領域の長さ(バイト数)を示す16または32ビット
(VRが明示的か暗黙的かに依存する)符号無し整数。
値長さが未定義の場合、このフィールドには
0xFFFFFFFFが設定されます(未定義長さ)。

【値領域】
データ要素の値が格納されている領域。
値が整数値なのか文字列なのかはVRによって判断されます。

31 :デフォルトの名無しさん:2006/08/23(水) 00:40:58
ブログでやれ

32 :デフォルトの名無しさん:2006/08/24(木) 00:32:06
とりあえず物凄く大まかな構造を解説したところで、
これまでの解説をプログラムでまとめてみましょう

int main(int argc, char* argv[])
{
  DicomFile DcmFile; // DICOMファイルを解析するクラスのインスタンス

  DcmFile.Open(argv[1]);

  DcmFile.ReadMetaInfo() ;

  DcmFile.ReadDataSet() ;

  return 0;
}


33 :デフォルトの名無しさん:2006/08/24(木) 00:47:21
DicomFileクラスはコメントにもある通り
DICOMファイルを読み込み、データを解析するクラスです
直感的に見て分かると思いますが上のプログラムでは

・DICOMファイルをオープンする
・DICOMファイルメタ情報を読み込んで解析する
・DICOMデータ集合を読み込んで解析する

の3つを行います
解析した結果をどうするかについてはまた別途考えます

/* 「解析する」ならRead〜じゃなくてParse〜の方が良かったか・・・ */

34 : ◆6MkREOQ1to :2006/08/24(木) 00:49:44
トリップ付けました

35 :1 ◆6MkREOQ1to :2006/08/24(木) 00:50:27
今日はこれで寝ます では

36 :デフォルトの名無しさん:2006/08/24(木) 01:25:55
なに?このキチガイ

37 :デフォルトの名無しさん:2006/08/24(木) 03:20:00
はじめから隔離スレだし、他で暴れられるよりいいじゃね?

38 :デフォルトの名無しさん:2006/08/24(木) 17:24:54
埋め

39 :デフォルトの名無しさん:2006/08/24(木) 17:27:04
産め

40 :デフォルトの名無しさん:2006/08/24(木) 17:36:28
うめ

41 :デフォルトの名無しさん:2006/08/24(木) 19:31:14
うめ

42 :デフォルトの名無しさん:2006/08/24(木) 19:36:53
ウメ

43 :デフォルトの名無しさん:2006/08/24(木) 19:38:25
ウメ

44 :デフォルトの名無しさん:2006/08/24(木) 20:03:42
埋め

45 :デフォルトの名無しさん:2006/08/24(木) 21:07:33


46 :デフォルトの名無しさん:2006/08/24(木) 21:54:20
埋め

47 :デフォルトの名無しさん:2006/08/24(木) 22:00:56
生め

48 :デフォルトの名無しさん:2006/08/24(木) 22:08:25
埋め

49 :デフォルトの名無しさん:2006/08/24(木) 22:11:01
うめ

50 :デフォルトの名無しさん:2006/08/24(木) 22:17:09
うめ

51 :デフォルトの名無しさん:2006/08/24(木) 22:35:59
埋め

52 :デフォルトの名無しさん:2006/08/25(金) 00:39:51
埋め

53 :1 ◆6MkREOQ1to :2006/08/25(金) 02:53:29
ねむー 今日は無理だ・・・
なので続きは明日

54 :デフォルトの名無しさん:2006/08/25(金) 19:19:27
もう来るな

55 :1 ◆6MkREOQ1to :2006/08/29(火) 23:31:18
いやー本業多忙で・・・
もうしばらく延期させてください

>>54
まぁそう言わず

56 :デフォルトの名無しさん:2006/08/30(水) 22:25:37
二度と来るな

57 :デフォルトの名無しさん:2006/08/31(木) 02:20:48
何だか分からないが本業がんばれ

58 :デフォルトの名無しさん:2006/08/31(木) 03:26:55
これですか? わかりません :D
ttp://www.youtube.com/watch?v=a6ErJVffY6E&mode=related&search=

59 :デフォルトの名無しさん:2006/08/31(木) 03:36:32
DCOMの解析かと思った
それだけは勘弁

60 :デフォルトの名無しさん:2006/09/02(土) 13:25:59
おれも、前に作ったが、iso-2022系の文字をサポートしているためハングルとか中国語とか
文字で死にそうだった。後は楽な仕様だが、規格が大きいので関係ないところを読み飛ばさないとつらい。


61 :1 ◆6MkREOQ1to :2006/09/05(火) 01:49:25
>>57
本業はMFC屋さんです

62 :1 ◆6MkREOQ1to :2006/09/05(火) 01:58:33
>>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)
 {
 }

63 :1 ◆6MkREOQ1to :2006/09/05(火) 02:00:15
 // 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;
 }

64 :1 ◆6MkREOQ1to :2006/09/05(火) 02:00:49
 // メタ情報を解析する
 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;
}

65 :1 ◆6MkREOQ1to :2006/09/05(火) 02:07:01
色々と突っ込みどころ満載なのはご愛嬌。
今日はおちまい。

66 :デフォルトの名無しさん:2006/09/16(土) 20:38:37
電波が足りん

67 :デフォルトの名無しさん:2006/10/29(日) 00:10:00
なんで、こんなニッチな分野がスレになってんの?

16 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)