医学数字影像和通讯(DICOM)编程简介

shuxin1979 2005-03-25 12:55:01
刚开接触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 只描述图像的基本参数:如病人基本资料、检验基本资料、系列资料、位置资料等等。
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章,其中第三章是“信息对象定义”,第五章是“数据结构和编码”,第六章是“数据字典”这几张比较重要。
img:http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_746525.jpg
三 如何编写dicom程序
自己编写dicom很困难,编出来的程序经常会有兼容性的问题。
本人提倡用开发包进行dicom程序编写,但是为了加深对dicom协议的了解还是应该尝试一下至少看一看别人的代码。
这里提供两个程序。这两个程序都存在兼容性的问题,有的dicom文件会读不出来。但是作为初学者的参考还是值得一看的。
第一个程序是pacs论坛上的总版主JB所写(对!还是那个人),“DcmBmp转换程序.rar”主要是把dicom文件中的像素信息转换成bmp文件。
第二个程序是一个pacs论坛上的一个网友wakyrei所写(由于服务器数据库文件以外遭到破坏这个人在pacs论坛上的所有信息都已经消失的无影无踪了),“dcm”此程序相当粗燥读起来需要一定耐心,作者好像根本不懂怎样使用mfc,不过其中的dicom类还是值得推敲的。
file: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.以上几项需要和例子程序中的设置保持一致。
img:http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_746527.jpg
五 dcmtk使用介绍
由于dcmtk荒茉趍fc下使用。所以需要生成库之后再调用。
这里给出两个程序。
1.利用dcmtk生成的静态库。
2.调用静态库生成了一个读dicom目录文件的程序。
整个程序都是参考dcmtk里的例子dcmdump.exe做的
http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_747225.rar
...全文
1170 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧