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

时间:2024-03-13 21:37:10

刚开接触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