医学数字影像和通讯(DICOM)编程简介刚开接触dicom时网上可查的资料真是太少了。
在此写出一些心得和经验和大家分享,希望坛子里做dicom的网友能够得到一些启发。
目录:
一 dicom是什么?
二 dicom文件结构
三 如何编写dicom程序
四 利用开发包开发dicom程序
五 dcmtk使用介绍
一 dicom是什么?
   dicom全名是医学数字影像和通讯。它是个编码和数据传输协议。医院里的ct机出来的x光胶片就是遵从这个协议编码的。当然其他仪器比如核磁共振等等也是如此。平时看到的胶片只是打印出来的dicom文件的部分数据。ct机所有的操作包括打印、生成文件、传输都要遵从dicom协议。
   dicom官方网站在这里 http://medical.nema.org 。dicom英文协议可以在这里下载。
   中国PACS论坛 http://www.cnpacs.org 这里有一个专门讨论dicom的板块里面有很多资料其中有网友翻译的dicom中文协议。(本文大部分资料都出自这个论坛)
二 dicom文件结构
   如图就是dicom文件的结构。
   图中所用软件是“jdicom”这是一个用java编写的免费软件,这个软件是我作dicom开发不可缺少的参考。它的网址是 http://www.tiani.com 进入网站在菜单research里面有“jdicom”一项。由于是java软件需要下载一个“j2re-1_3_1_14-windows-i586-i.exe”网址在这里 http://java.sun.com/products/archive/index.html 当然“www.tiani.com”也会有相关联接。
下面引用pacs论坛上总版主JB的一片帖子忘记了。
来简要介绍dicom文件结构。相信有了上面软件“jdicom”直接对dicom的观察和这篇pacs上的帖子再加对dicom协议的阅读后相信对dicom文件的结构会有一个清晰的了解。
以下是帖子内容:
    DICOM 文件格式
DICOM 文件内容在 Part 3 DICOM IOD 里定义。CT, MR, CR, DR, US, NM, PET, XA 等各有自己的内容定义,由共同的专有的部分 (IE 和 Modules) 组成。
DICOM 文件内容由两个部分组成:存参数的 header 和图点数据 (pixel data)。
header 只描述图像的基本参数喝绮∪嘶咀柿稀⒓煅榛咀柿稀⑾盗凶柿稀⑽恢米柿系鹊取?br>DICOM 的 4 个内容层次:
1. Patient (病人)
2. Study (检验)
3. Series (系列)
4. Image (图像)
尽管头几层的内容在很多图像里是相同的,它们在每个图像文件里都要有。
每一层叫一个 Information Entity,或 IE (从 relational database schema 设计引用而来)。每一层又细分成 Module。每个 Module 里面的最小单元叫做一个 attribute 或 element。
现在举个例子:CR 图像 (DICOM Part 3, A.2.3, Table A.2-1 
1. Patient IE:
a. Patient Module (参考 C.7.1.1)
2. Study IE:
a. Study Module (参考 C.7.2.1)
b. Patient Study Module (参考 C.7.2.2)
3. Series IE:
a. General Series (参考 C.7.3.1)
b. CR Series (参考 C.8.1..1)
c. General Equipment (参考 C.7.5.1)
4. Image IE:
a. Genrral Image (C.7.6.1)
b. Image Pixel (C.7.6.3)
c. Contrast/bolus (C.7.6.4)
d. CR Image (C.8.1.2)
...
i. SOP Common (C.12.1)
将这些 modules (tables) 里的所有 elements 都找出来就做成了一个 CR 图像的架构。
要注意的是这些 module 有些是一定要的 (modatory) 有些是用户选用的 (user)。
到了每个 module 里 attribute/element 表又有分五类 Type 1, 1C, 2, 2C 和 3。 Type 1 是一定要的,2 也是一定要的但是内容可以是空的。Type 3 则可要可不要。
所以浓缩一下,一个 CR 图像里的元素 (elements) 也不是太多。
把这些表格展开后,这些 elements 组成一个 dataset。 
那么写到一个文件里或通过网路传送又是个什么格式呢?这就要看 Part 5。
一个元素 (element) 的结构是:
1. group tag: 16-bit
2. element tag: 16-bit
3. length (or VR/length): 32-bit
4. data (bytes of length)
对应每一个用到的 element DICOM 标准 Part 6 都定义了一个 group tag 和 element tag。比如说:
patient name: 0x0010, 0x0010
patient ID: 0x0010, 0x0020
...
VR 说的是 element 格式,比如说 patinet name 的 VR 是 PN。格式是 last_name^first_name^middle_name^prefix^surfix。那么我的英文名字就是: Wang^JB^^Dr.^往外写时要做几个事情:
1. 要把所有元素按 group tage 和 element tag 理一遍 (sort)。从小排到大。
2. 如果是写 DICOM 介质的 DICOM file 还先写 128 bytes preamble (一般是空白),加 "DICM", 加 group 2 Meta header。(讲到 Part 10 时再细说)
3. 如果 dataset 里面含有 Sequence elements, sequence 里面每一个 Item 又是一个 dataset。
[注意]:dicom协议共有15章,其中第三章是“信息对象定义”,第五章是“数据结构和编码”,第六章是“数据字典”这几张比较重要。
三 如何编写dicom程序
自己编写dicom很困难,编出来的程序经常会有兼容性的问题。
本人提倡用开发包进行dicom程序编写,但是为了加深对dicom协议的了解还是应该尝试一下至少看一看别人的代码。
这里提供两个程序。这两个程序都存在兼容性的问题,有的dicom文件会读不出来。但是作为初学者的参考还是值得一看的。
第一个程序是pacs论坛上的总版主JB所写(对!还是那个人),“DcmBmp转换程序.rar”主要是把dicom文件中的像素信息转换成bmp文件。
第二个程序是一个pacs论坛上的一个网友wakyrei所写(由于服务器数据库文件以外遭到破坏这个人在pacs论坛上的所有信息都已经消失的无影无踪了),“dcm”此程序相当粗燥读起来需要一定耐心,作者好像根本不懂怎样使用mfc,不过其中的dicom类还是值得推敲的。
http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_746526.rar 五 四利用开发包开发dicom程序
   开发dicom的工具包有很多,这里要说的是dcmtk这个开发包是免费全部开发源代码。
   dcmtk开发包的官方网站是 http://www.dcmtk.org 。在左面的DICOM Software中点击DCMTK一项就进入了dcmtk下载项。这里有很多链接。只需要下载两项:
1.DCMTK 3.5.3 - source code and documentation (2004-05-27)
2.DCMTK 3.5.3 - support libraries for Windows
   先别忙着解压,还需要另外一个软件来生成工程文件。这个软件叫cmake。官方网站是这个 http://www.cmake.org 很多医学相关的开发包像vtk/itk都需要这个软件来生成工程文件。
下图就是cmake打开dcmtk开发包的样子。  
需要说明的是几个WITH_*选项就是“2.DCMTK 3.5.3 - support libraries for Windows”解压出来的东西。点击两次configure之后就可以点ok生成工程文件了。
   工程文件编译好之后程序会生成很多例子程序可以用来参考。举个例子:运行dcmdata\apps\Debug\dcmdump.exe这个程序。这是一个解析dicom文件的程序。如果想开发dicom文件可以参照这个程序。
   调用库的时候要注意几个问题:
   1.工程设置/cc++/preprocessor/附加包含路径。这里设置头文件
   2.工程设置/link/input/对象库模块。这里设置库文件。
   3.工程设置/link/project option/。这里设置库文件路径。
   4.工程设置/cc++/code generation/Use run-time library。
   5.以上几项需要和例子程序中的设置保持一致。
五dcmtk使用介绍
   由于dcmtk不能在mfc下使用。所以需要生成库之后再调用。
   这里给出两个程序。
   1.利用dcmtk生成的静态库。
   2.调用静态库生成了一个读dicom目录文件的程序。
整个程序都是参考dcmtk里的例子dcmdump.exe做的图片在这里:http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=135248&forum_id= 
http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_747225.rar