Dicom格式文件解析器

合集下载

dicom读取方法

dicom读取方法

Dicom格式文件解析器学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的无非就是字节码流处理。

只不过确实比较繁琐。

分析整体结构先是128字节所谓的导言部分,说俗点就是没啥意义的破数据跳过就是了,然后是dataElement依次排列的方式就是一个dataElement接一个dataElement的方式排到文件结尾通俗的讲dataElement就是指tag 就是破Dicom标准里定义的数据字典。

tag是4个字节表示的前两字节是组号后两字节是偏移号比如0008,0018。

所有dataElement在文件中都是按tag排序的比如0002,0001? 0002,0002? 0003,0011文件整体结构如下:又把论文里的这图贴上来总结的很好。

单个dataElement的结构如下:显示VR:VR为OB?OW?OF?UT?SQ?UN的元素结构显示VR:VR为普通类型时元素结构(少了预留那一行)隐式VR?时元素结构?要问VR是啥东东,值表示法啥叫值表示法啊俺不懂 int string short ushort 懂不就是这个意思,Dicom标准真坑爹非要整个怪怪的概念。

VR总共27个跟c#值类型对应关系我都写好了:1string getVF(string VR, byte[] VF)2 {3string VFStr = ;4switch (VR)5 {6case"SS":7 VFStr = (VF, 0).ToString();8break;9case"US":10 VFStr = (VF, 0).ToString();1112break;13case"SL":14 VFStr = (VF, 0).ToString();1516break;17case"UL":18 VFStr = (VF, 0).ToString();1920break;21case"AT":22 VFStr = (VF, 0).ToString();2324break;25case"FL":26 VFStr = (VF, 0).ToString();2728break;29case"FD":30 VFStr = (VF, 0).ToString();3132break;33case"OB":34 VFStr = (VF, 0);35break;36case"OW":37 VFStr = (VF, 0);38break;39case"SQ":40 VFStr = (VF, 0);41break;42case"OF":43 VFStr = (VF, 0);44break;45case"UT":46 VFStr = (VF, 0);47break;48case"UN":49 VFStr = break;51default:52 VFStr = break;54 }55return VFStr;56 }找个dicom文件在十六进制编辑器下瞧瞧给你整明白:所有dataElement从前到后按tag又可简单分段:几个特殊的tag很重要前面说过了tag就是dicom里定义的字典。

DICOM的名词解释

DICOM的名词解释

DICOM的名词解释DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是一种用于医学图像和相关信息的国际标准。

DICOM被广泛应用于医学影像设备、医疗信息系统和图像处理软件等领域。

本文将介绍DICOM标准中一些常用的名词和概念。

1. DICOM图像DICOM图像是医学成像设备生成的二维或三维图像,如CT扫描、X射线片、核磁共振图像等。

DICOM图像文件通常以.dcm为扩展名,并包含了图像本身的像素数据以及与图像相关的患者信息、设备信息等。

DICOM图像具有跨平台、互操作性强的特点,可以在不同的医疗设备和软件中进行传输、显示和分析。

2. DICOM文件格式DICOM文件格式定义了图像和相关信息在存储和传输中的组织方式。

DICOM文件由一系列的数据元素(Data Element)组成,每个数据元素包含了一个标签、一个值和一些描述信息。

标签用于唯一标识每个数据元素,而值则存储了具体的信息。

DICOM文件采用二进制格式存储,可以通过解析文件头部的元数据来获取图像本身的像素数据。

3. DICOM标准DICOM标准由美国医学影像与生物工程学会(ACR-NEMA)和国际电工委员会(IEC)共同制定,旨在促进医学图像设备和信息系统之间的互操作性。

DICOM 标准规定了医学图像的格式、传输协议、数据元素的定义等内容,确保了不同厂商的设备和软件能够正确读取和解析DICOM图像。

DICOM标准的持续更新和演进,使其成为了医学影像行业的重要基础。

4. DICOM服务DICOM服务定义了医学影像设备和信息系统之间的通信方式和协议。

常见的DICOM服务包括图像查询检索服务(C-FIND)、图像存储服务(C-STORE)、图像传输服务(C-MOVE)等。

这些服务通过网络协议(如TCP/IP)实现,允许不同设备之间的图像传输、共享和查询。

DICOM服务的实现,使得医学影像数据能够在不同地点和时间进行远程交流和访问。

pydicom和SimpleITK分别解析医学影像中dicom文件

pydicom和SimpleITK分别解析医学影像中dicom文件

pydicom和SimpleITK分别解析医学影像中dicom⽂件⾸先,⽆论是pydicom还是SimpleITK都是需要事先导⼊到python中的库,如果使⽤的是pycharm IDE,可以先创建python3的虚拟环境,然后在虚拟环境下通过file-setting-Project interpreter ,在添加模块⾥⾯直接搜上述两个库的名称,点击安装即可。

pydicom提取单张dicom图像1import pydicom2from matplotlib import pyplot34 ds = pydicom.read_file('C:/Users/****/Desktop/CT000000.dcm')# DICOM⽂件的位置5print(ds.dir()) # 打印所有 DICOM TAG 名6print(ds.dir('Pixe')) # 打印包含 'pat' 的 DICOM TAG7print(ds.PatientName, ds.PatientSex, ds.PatientID, ds.PatientBirthDate, ds.PatientAge) # 打印 DICOM TAG 相应的属性值8print(ds.data_element('PatientName')) # 打印⼀个完整的数据元素,包括 DICOMTAG编码值(Group, Element), VR, Value9print(ds.data_element('PatientID').VR, ds.data_element('PatientID').value)10 pixel_bytes = ds.PixelData # 原始⼆进制⽂件1112 pix = ds.pixel_array # 像素值矩阵13print(pix.shape) # 打印矩阵维度14 pyplot.imshow(pix, cmap=pylab.cm.bone)15 pyplot.show() # cmap 表⽰ colormap,可以是设置成不同值获得不同显⽰效果,打印dicom图⽚注意,此时可能会报错,报错的地⽅是ds.pixel_array,原因是某些格式的dicom⽂件不能⽤pydicom提取,。

DICOM医学影像文件格式解析

DICOM医学影像文件格式解析

DICOM医学影像⽂件格式解析DICOM医学影像⽂件格式解析dicom协议中⽂⽂档可去csdn下载1.DICOMDICOM(DigitalImaging andCommunications inMedicine)是指医疗数字影像传输协定,是⽤于医学影像处理、储存、打印、传输的⼀组通⽤的标准协定。

它包含了⽂件格式的定义以及⽹络通信协议。

DICOM是以TCP/IP为基础的应⽤协定,并以TCP/IP联系各个系统。

两个能接受DICOM格式的医疗仪器间,可通过DICOM格式的⽂件,来接收与交换影像及病⼈资料。

⽬前,DICOM被⼴泛应⽤于放射医疗,⼼⾎管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和⽛科等其它医学领域得到越来越深⼊⼴泛的应⽤。

⽬前采⽤的标准是DICOM3.0,每⼀张图像中都携带着⼤量的信息,这些信息具体可以分为以下四类:(a)Patient(b)Study(c)Series(d)Image每⼀个DICOM Tag都是由两个⼗六进制数的组合来确定的,分别为Group和Element。

如(0010,0010)这个Tag表⽰的是Patient’s Name,它存储着这张DICOM图像的患者姓名。

2.DICOM存储格式DICOM⽂件的整体结构如下表所⽰,先是128字节的导⾔部分(没有实际信息),接着是四个字节组成的"DICM"字符串,然后是若⼲DataElement元素依次排列直⾄⽂件结束。

导⾔"DICM"DataElement DataElement...DataElement128 Byte 4 Byte n Byte n Byte n Byte2.1 DataElement的三种结构DataElement是存储⽂件信息的主体,DataElement的总体结构如下表所⽰:Tag VR(值表⽰法)Len(数据长度)数据值(内容)4 Byte 2 Byte 2 Byte Len ByteTag由2 Byte的组号(group)和2 Byte的元素号(element)组成,VR是DICOM特有的值表⽰法,关于值表⽰法的解释见下⽂按照VR的类型以及是否显⽰VR,DataElement⼜分为三种具体的结构。

DICOM图像文件解析及程序设计

DICOM图像文件解析及程序设计

DICOM图像文件解析及程序设计魏军;刘荣鑫;宋国兴;李金屏【期刊名称】《济南大学学报(自然科学版)》【年(卷),期】2007(021)003【摘要】分析DICOM标准,建立解析DICOM文件的模型,研究DICOM文件解析及其图像显示的方法.以DICOM3.0标准为对象,提出将DICOM文件划分为概念模型、数据模型、物理模型3个层面;以概念模型、数据模型为指导进行解析程序的设计,将物理模型与程序设计相结合进行解析程序的编程实现;利用线性/非线性两种算法对文件中的医学图像进行显示以及窗宽/窗位的调整.测试结果表明,该DICOM 文件解析程序能够完整解析DICOM3.0标准文件,显示医学图像并支持窗宽/窗位的调整.通过对标准的分析编程实现了DICOM3.0医学图像文件的解析、显示和调整.【总页数】4页(P215-218)【作者】魏军;刘荣鑫;宋国兴;李金屏【作者单位】济南大学控制科学与工程学院山东济南 250022;北京航空航天大学机器人所北京 100083;济南大学信息科学与工程学院山东济南 250022;济南大学信息科学与工程学院山东济南 250022;济南大学信息科学与工程学院山东济南 250022【正文语种】中文【中图分类】TP242.3【相关文献】1.DICOM格式医学图像及其图像信息的显示 [J], 高升;葛云2.DICOM标准医学图像文件解析及工具软件的研制 [J], 邱明辉;刘海一3.DICOM全方向M型心动图系统DICOM图像解析方法研究 [J], 许剑锋;黄立勤;林强4.DICOM文件解析及其消息传输 [J], 张元鲁;王超5.DICOM数据集研究和DICOM图像处理软件的实现 [J], 伍亚军;周正东;戴耀东因版权原因,仅展示原文概要,查看原文内容请购买。

dcm文件怎么打开?dcm文件用什么软件可以打开?

dcm文件怎么打开?dcm文件用什么软件可以打开?

dcm文件怎么打开?dcm文件用什么软件可
以打开?
dcm文件用什么软件可以打开?dcm文件被广泛应用于医疗行业,支持心电图、核磁共振图、超声心动图等等,如果你没有安装特定的打开dcm的软件是无法打开dcm文件的。

那么要使用哪一款软件打开dcm文件呢?其实医学DICOM图像浏览器软件就可以打开。

具体步骤:
1、在本站下载医学DICOM图像浏览器,得到安装包。

2、我们找到下载好的软件安装程序,然后双击安装。

3、接下来的这一步是安装的路径,这里默认是安装在c盘,直接下一步。

4、接下来提示已做好安装程序的准备,也就是我们前期的设置都完成了,直接就可以安装了。

5、接下来就是正在安装这个软件,中间有个进度条会显示安装的进度。

6、进度条走完之后,就直接会提示软件已经安装完成,也就是软件已经安装成功了,那么我们选择完成按钮结束此次的安装过程。

7、然后我们打开刚才安装好的软件,就进入了软件的界面。

8、接下来我们就来试着打开下我们的dcm文件,点击菜单栏的文件选项,选择打开文件,也可以直接选择打开文件的图标。

9、选择打开文件之后,就会弹出选择dcm文件的窗口,这里找
到我们想要打开的dcm文件所在的位置,找到文件然后选择打开即可。

DICOM图像文件解析及程序设计

DICOM图像文件解析及程序设计
第 21卷第 3期 2007年 7月
济南大学学报 (自然科学版 ) JOURNAL OF UN IVERSITY OF J INAN ( Sci. & Tech1)
文章编号 : 1671 - 3559 (2007) 03 - 0215 - 04
D ICOM 图像文件解析及程序设计
Vol. 21 No. 3 Jul. 2007
当概念模型的数据元素映射到数据模型的数据 元素时 , 数据元素的结构即为数据结构 , 它在 D I2 COM 标准中是唯一的 ,结构如图 3。
Tag代表标识 ,其组标识和元素标识唯一确定 一个数据元素 ; VR (Value Rep resentation)代表值表 示法 [5] , 其内容指明值域中值的数据类型 , 例如 “PN ”为姓名类型 ,“AS”为年龄类型 ,“DA ”为日期
(2)值长度可变的显式 VR的元素结构 对于其它 VR 值 , Length域是跟在两个字符长 的 VR 域后的 16位无符号整数 ,即 VR 域与 Length 域各占 16位 。对值域中的内容进行解析时应将 VR 与 Length相结合 。 (3)隐式 VR 的元素结构 当使用不含 VR 域的结构时 ,数据元素由 3 个 连续域构成 : Tag, Length和 ValueField。如果值域有 一个明确长度 ,那么值长度字段应包含相当于值域 长度的值 。 3. 2 数据集 数据集是由与信息对象相关的数据元素集合组 成的交换信息集 。数据集中的每一个属性值都由数 据元素进行表示 。每个元素在数据集中紧密相连 。 由递增数据元素标识 ( Tag)安排的数据元素的集合 是现实世界对象属性值的编码 。数据集结构如图 4 所示 。
针对icom文件数据模型以及物理模型的分析都是围绕着数据元素而展开的模块为了简化信息对象的定义icom标准将每一个复合化信息对象的数据元素与集合中相似的元素分开并将这些数据元素的分组指定为独立的模块信息实体从数据元素划分出独立的模块后可根据同样的性质划分方式将有相似之处的模块组织为信息实体不同的实体可共享相同的模块

DICOM医学图像文件格式解析与信息提取

DICOM医学图像文件格式解析与信息提取
档 ) ; () 2 查询 和返 回所 需对 象 ;
() 3 完成特殊的工作( 如在胶片上打印图像) ;
() 4 工作流程的管理( 支持 WO K IT和状态 R LS 信息 ) ; () 5 可视图像的质量和一致性 。
简而 言 之 , I O 标 准 是 基 于 内 容 的 医学 图 DC M
ZHo Fe g U n
【bt c】 T ippr rf e r e t IO t dr,n yio t IO l f m tte s o E D As f h DC M f r a, e f A — s il cb e a d l s e i o e h u L
M d i )是美 国放射学会 和美 国电器制造商协会 ein , ce 组织制定的专 门用于医学 图像存储和传输的标准 。 经过十多年的发展 , 该标 准已经被 医疗设备生产商 和医疗界广泛接受 , 为医学 图像信息学领域的国 成
际通 用标 准 。
信息对象可以完成五个方面的功能 : () 1传输和存储完整 的对象 ( 如图像 、 波形和文
据元素一 一对应。它 由组号 和元素 号构成 , 如 例 (0 802 ) 0 0 ,0 0就是组号为 0 00 , x0 8元素号为 OO 2 x 00 的“ 检查 日期” 数据元素 的 T g a 号。D C M 的数据 IO 字典定义 了许多数据元素标记 , 涵盖 了大多数 的应
用需 要 。组号 为偶 数 的 是标 准 数 据元 素 , 体 含 义 具 在 DIOM 的数 据 字 典 中定 义 ; 号 为 奇 数 的为 私 C 组

有数据元素 , 由用户在使用过程中定义。
3 ・ 2
第 1 卷・ 5 1 第 期
周峰 : I O 医学 图像文件格式解析与信息提取 DC M
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Dicom格式文件解析器学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题只讲*.dcm也就是diocm格式文件的读取,读取本身是没啥难度的无非就是字节码数据流处理。

只不过确实比较繁琐。

分析又把论文里的这图贴上来总结的很好。

单个dataElement的结构如下:隐式VR?时元素结构要问VR是啥东东,值表示法啥叫值表示法啊俺不懂intstringshortushort懂不就是这个意思,Dicom标准真坑爹非要整个怪怪的概念。

VR总共27个跟c#值类型对应关系我都写好了:1string getVF(string VR,byte[]VF)2{345{6case78break9case10111213case14151617case18192021case22232425case262728break;29case"FD":30VFStr=BitConverter.ToDouble(VF,0).ToString();3132break;33case"OB":34VFStr=BitConverter.ToString(VF,0);35break;36case"OW":37VFStr=BitConverter.ToString(VF,0);38break;39case"SQ":40VFStr=BitConverter.ToString(VF,0);41break;42case"OF":43VFStr=BitConverter.ToString(VF,0);44break;45case"UT":46VFStr=BitConverter.ToString(VF,0);4748case495051525354}5556}找个所有dataElement从前到后按tag又可简单分段:几个特殊的tag很重要前面说过了tag就是dicom里定义的字典。

文件元dataElement和跟像素数据相关的dataElement都很重要,其他的很多如果全部照顾完的话估计得写上千行switch语句来确定关键的12{34{5case67break8case91011case121314case151617case181920case21return"SQ";22break;23case"0008,1111":24return"SQ";25break;26case"0008,0020"://检查日期27return"DA";28break;29case"0008,0060"://成像仪器32case"0008,0070"://成像仪厂商33return"LO";34break;35case"0008,0080":36return"LO";37break;38case"0010,0010"://病人姓名39return"PN";4041case424344case454647case484950case515253case545556case575859case606162case636465case"0020,0013"://影像编号66return"IS";67break;68case"0028,0002"://像素采样1为灰度3为彩色69return"US";70break;71case"0028,0004"://图像模式MONOCHROME2为灰度72return"CS";73break;74case"0028,0010"://row高77case"0028,0011"://col宽78return"US";79break;80case"0028,0100"://单个采样数据长度81return"US";82break;83case"0028,0101"://实际长度84return"US";8586case878889case909192case939495case969798case99100101102103104105106107108109110case"7fe0,0010"://像素数据开始处111return"OW";112break;113default:114return"UN";115break;116}117}最关键的两个tag:0002,0010普通tag的读取方式little字节序还是big字节序?隐式VR还是显示VR。

由它的值决定1switch(VFStr)2{3case://显示little4isLitteEndian=true;5isExplicitVR=true;6break;7case:891011case121314151617}整理第一步第二步并根据0002,就确定两个东西而已1字节序这个基本上都是little字节序。

举个例子吧十进制数35280用十六进制表示是0xff00?但是存储到文件中你用十六进制编辑器打开你看到的是这个样子00ff这就是little字节序。

平常我们用的x86PC在window s下都是little字节序包括AMD的CPU。

别太较真较真的话这个问题又可以写篇博客了。

2确定从0002以后的dataElement的VR是显示还是隐式。

说来说去0002,0010的值就那么固定几个并且只能是那么几个这些都在那个北美放射学会定义的dicom标准的第六章有说明:上面的那段代码其实就是这个表格的实现,讲到这里你会觉得多么的坑爹啊是的dicom面向对象的破概念非常烦的。

第三步:读取普通tag直到搜寻到7fe0,0010这个最巨体的存储图像数据的dataElement它一个顶别人几十个上百个。

我们在前一步已经把VR是显示还是隐式确定通过前面的图,也就是字节码在这种号称16位的+1000,空即把1000密度1000一句话,从2047个等级的灰度里选取一个范围放到0~255的灰度环境里显示。

怎样把12位灰度影射到8位灰度显示出来呢,还怎么显示上面方法都给说明了基本上算半成品了。

联想到角度制弧度制,设要求的8位灰度值为x已知的12位灰度值为y那么:x/255=y/2047那么x=255y/2047原理不多讲等比中项十字相乘法这个是初中的知识哈。

初中没读过的童鞋飘过。

原理过程讲完了代码走起1class DicomHandler2{3string fileName="";4Dictionary<string,string>tags=new Dictionary<string,string>();//dicom文件中的标签5BinaryReaderdicomFile;//dicom文件流67//文件元信息/////////////8910long1112long13bool14bool1516//17int1819int2021{22if23242526//271282829if(30{31MessageBox.Show("没有dicom标识头,文件格式错误");32return;33}343536tagRead();3738IDictionaryEnumeratorenor=tags.GetEnumerator();39while(enor.MoveNext())40{41if9)42{43"\r\n";44'\0','');45}46else47'\0','')+"\r\n";48}49dicomFile.Close();50}5152{5354}555657{5859{60case616263case646566case6768697071}72}7374{75if(fileName==string.Empty)76returnfalse;7778int dataLen,validLen;//数据长度有效位79int imgNum;//帧数8081rows=int.Parse(tags["0028,0010"].Substring(5)); 82cols=int.Parse(tags["0028,0011"].Substring(5)); 8384colors=int.Parse(tags["0028,0002"].Substring(5));85dataLen=int.Parse(tags["0028,0100"].Substring(5));86validLen=int.Parse(tags["0028,0101"].Substring(5));8788gdiImg=new Bitmap(cols,rows);8990BinaryReaderdicomFile=new BinaryReader(File.OpenRead(fileName)); 91929394long reads=0;95for(96{97for(98{99if100101102103104105if106{107int108109110//111//1112int113int114115if116117118119120{121grayGDI=(int)((gray-grayStart)*255/windowWith);122}123124if(grayGDI>255)125grayGDI=255;126elseif(grayGDI<0)127grayGDI=0;128c=Color.FromArgb(grayGDI,grayGDI,grayGDI);129}130elseif(colors==3)131{132c=Color.FromArgb(pixData[0],pixData[1],pixData[2]);133}134135gdiImg.SetPixel(j,i,c);136}137}138139dicomFile.Close();140141}142143{144145int146147148149{150//151152153154155156//157//158一步被阻159if160{161VR=162163if164{1652,SeekOrigin.Current);166Len=dicomFile.ReadUInt32();167}168else169Len=dicomFile.ReadUInt16();170}171elseif(tag=="fffe,e000"||tag=="fffe,e00d"||tag=="fffe,e0dd")//文件夹标签172{173VR="**";174Len=dicomFile.ReadUInt32();175}176elseif(isExplicitVR==true)//有无VR的情况177{178VR=newstring(dicomFile.ReadChars(2));179180if(VR=="OB"||VR=="OW"||VR=="SQ"||VR=="OF"||VR=="UT"||VR=="UN")181{1822,SeekOrigin.Current);183Len=dicomFile.ReadUInt32();184}185186187}188189{190191192}193//194一步被195196197if198{199200201202VR=203204}205)//206{207if(enDir==false)208{209enDir=true;210folderData.Remove(0,folderData.Length);211folderTag=tag;212}213else214{215leve++;//VF不赋值216}217}218elseif((tag=="fffe,e00d"&&Len==UInt32.MinValue)||(tag=="fffe,e0dd"&&Len==UInt32.M inValue))//文件夹结束标签219{220if(enDir==true)221{222enDir=false;223}224else225{226227}228}229230231232233234235236tag237//238if239{240241242}243244{245246{247248249250break;251case://显示big252isLitteEndian=false;253isExplicitVR=true;254break;255case://隐式little256isLitteEndian=true;257isExplicitVR=false;258break;259default:260break;261}262}263for(int i=1;i<=leve;i++)264tag="--"+tag;265//------------------------------------数据搜集代码266if((VR=="SQ"&&Len==UInt32.MaxValue)||(tag=="fffe,e000"&&Len==UInt32.MaxValue)||le ve>0)//文件夹标签代码267{268folderData.AppendLine(tag+"("+VR+"):"+VFStr);269}270271{272273274}275276277}278}279}1if2345678910this.Text="DicomViewer-"+openFileDialog1.FileName;111213backgroundWorker1.RunWorkerAsync();这里处理gdi位图的时候直接用的setPix处理速度比较慢所以用了backgroundWorker,实际应用中请使用内存缓冲跟指针的方式否则效率低了是得不到客户的认可的哦,gdi位图操作可使用lockBits加指针的方式,12位的灰度像素数据可以第一次读取后缓存到内存中以方便后面调窗的快速读取优化这点代码也不难哈对指针什么的熟点就行了,前几章都有。

相关文档
最新文档