【转】医学图像之DICOM格式解析

最近导师给安排了新任务,由于刚进入实验室,对于医学图像这一块还一知半解,所以就想分享一下有关医学常见影像的学习资料(尤其是dicom后缀的图像文件),欢迎大家一起交流。

目录

1.医学影像学的介绍

2.DICOM信息的简介

3.DICOM内部信息详解(DICOM Tag与VR)

4.利用python+pydicom这个库解析DICOM文件

5.DICOM的三个切面


 

1.医学影像学

(1).医学影像学Medical Imaging,是研究借助于某种介质(如X射线、电磁场、超声波等)与人体相互作用,把人体内部组织器官结构、密度以影像方式表现出来,供诊断医师根据影像提供的信息进行判断,从而对人体健康状况进行评价的一门科学,包括医学成像系统和医学图像处理两方面相对独立的研究方向。

(2).仪器主要包括X光成像仪器、CT(普通CT、螺旋CT)、正子扫描(PET:Positron emission tomography)、超声(分B超、彩色多普勒超声、心脏彩超、三维彩超)、核磁共振成像(MRI:Nuclear Magnetic Resonance Imaging)、心电图仪器、脑电图仪器等

2.DICOM简介

(1)DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。所有患者的医学图像都以 DICOM 文件格式进行存储。这个格式包含关于患者的 PHI(protected health information,https://en.wikipedia.org/wiki/Protected_health_information)信息,例如姓名,性别,年龄,以及其他图像相关信息比如捕获并生成图像的设备信息,医疗的一些上下文相关信息等。医学图像设备生成 DICOM 文件,医生使用 DICOM 阅读器(能够显示 DICOM 图像的计算机软件)阅读并对图像中发现的问题进行诊断

(2)目前采用的标准是DICOM3.0,每一张图像中都携带着大量的信息,这些信息具体可以分为以下四类:(a)Patient(b)Study(c)Series(d)Image。每一个DICOM Tag都是由两个十六进制数的组合来确定的,分别为Group和Element。如(0010,0010)这个Tag表示的是Patient’s Name,它存储着这张DICOM图像的患者姓名。

(3)基于C++的DCMTK、基于Java的dcm4che以及基于python的pydicom,都是非常优秀的解释DICOM标准的第三方库,通过在工程中引入它们可以避免软件开发人员去进行底层的解析工作,可为项目开发提高效率。下文将会利用基于python的pydicom解析一下dicom文件。

(4)目前例如CT,核磁共振,超声等利用精确准直的X线束、γ射线、超声波等,与灵敏度极高的探测器一同围绕人体的某一部位作一个接一个的断面扫描,所以扫描后得到的图像是多层的图像,而我们把一层层的图像在z轴上堆叠起来就可以形成三维图像(这就涉及到三维重建的问题),这时,每一层的图像我们都可以存在dicom文件中(当然,dicom文件不是单纯的像素信息,它还有很多的数据头部信息),如下图,我们的目的就是要把在这些数据头部信息和像素信息从一系列dicom文件中读取出来。

 

(5) DICOM文件是指按照DICOM标准而存储的医学文件,一般由一个DICOM文件头和一个DICOM数据集合组成,结构图如下图

DICOM文件头包含了标识数据集合的相关信息,每个DICOM文件都必须包括一个文件头:

  • 文件导言,由128个字节组成。
  • DICOM前缀,由4个字节组成,通过判断该4个字节的字符串是否等于“DICM”来判断该文件是不是DICOM文件。
  • 文件信息元素

3.DICOM内部信息详解(DICOM Tag与VR)

(1)DICOM文件的主要组成部分是数据集,它是由DICOM数据元素按照指定的顺序依次排列组成的。对于DICOM文件,一般采用显式传输,数据元素按照标签Tag从小到大顺序排列。最基本的单元是数据元,数据元主要由4个部分组成:

  • DICOM TAG: 存储该项信息的标识
  • VR(value representation) :存储描述该项信息的数据类型。
  • value length : 存储描述该项信息的数据长度
  • value: 存储描述该项信息的数据值

(2)DICOM TAG的分类与说明,在上一个内容中说过,DICOM TAG具体可分为4大类。

  • Patient Tag 
  • Study Tag

  • Series Tag

  • Image Tag

(3)VR是DICOM标准中用来描述数据类型的,总共有27个值。简单分类如下

 

 4.利用python+pydicom这个库解析DICOM文件

1.1首先导入解析DICOM文件所需的库

1 import pydicom
2 import pylab

1.2加载DICOM文件

1 ds = dicom.read_file('D:/dicom_image/V/P01-0000.dcm')# 在你机器上DICOM文件的位置

1.3相关属性的打印

 

  print(ds.dir()) # 打印所有 DICOM TAG 名print(ds.dir('pat')) # 打印包含 'pat' 的 DICOM TAGprint(ds.PatientName, ds.PatientSex, ds.PatientSize, ds.PatientWeight ) # 打印 DICOM TAG 相应的属性值print(ds.data_element('PatientID')) # 打印一个完整的数据元素,包括 DICOMTAG编码值(Group, Element), VR, Valueprint(ds.data_element('PatientID').VR, ds.data_element('PatientID').value)pixel_bytes = ds.PixelData # 原始二进制文件pix = ds.pixel_array       # 像素值矩阵print(pix.shape) # 打印矩阵维度pylab.imshow(pix, cmap=pylab.cm.bone)pylab.show() # cmap 表示 colormap,可以是设置成不同值获得不同显示效果,打印dicom图片

 

2.以上只是针对一张DICOM图片进行解析,接下来让我们看看将一系列的dicom文件读入的效果。

首先导入相应所需要的包

1 import os
2 import pydicom
3 import numpy
4 from matplotlib import pyplot

其次就是解析代码

 

 

 1 # 用lstFilesDCM作为存放DICOM files的列表2 PathDicom = "D:/dicom_image/V"  # 与python文件同一个目录下的文件夹3 lstFilesDCM = []4 5 # 将所有dicom文件读入6 for diName, subdirList, fileList in os.walk(PathDicom):7     for filename in fileList:8         if ".dcm" in filename.lower():  # 判断文件是否为dicom文件9             print(filename)
10             lstFilesDCM.append(os.path.join(diName, filename))  # 加入到列表中
11 
12 ## 将第一张图片作为参考图
13 RefDs = pydicom.read_file(lstFilesDCM[10])  # 读取第一张dicom图片
14 # print(RefDs)
15 # print(RefDs.pixel_array)
16 # print(RefDs.PatientPosition)
17 pyplot.imshow(RefDs.pixel_array, cmap=pyplot.cm.bone)
18 pyplot.show()
19 
20 # 建立三维数组,分别记录长、宽、层数(也就是dicom数据个数)
21 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM))
22 print(ConstPixelDims)
23 
24 # 得到spacing值 (mm为单位)
25 # PixelSpacing - 每个像素点实际的长度与宽度,单位(mm)
26 # SliceThickness - 每层切片的厚度,单位(mm)
27 ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
28 
29 # 三维数据
30 x = numpy.arange(0.0, (ConstPixelDims[0] + 1) * ConstPixelSpacing[0], ConstPixelSpacing[0])  # 0到(第一个维数加一*像素间的间隔),步长为constpixelSpacing
31 y = numpy.arange(0.0, (ConstPixelDims[1] + 1) * ConstPixelSpacing[1], ConstPixelSpacing[1])  #
32 z = numpy.arange(0.0, (ConstPixelDims[2] + 1) * ConstPixelSpacing[2], ConstPixelSpacing[2])  #
33 print(len(x),"xxxx")
34 
35 ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype)
36 
37 # 遍历所有的dicom文件,读取图像数据,存放在numpy数组中
38 for filenameDCM in lstFilesDCM:
39     ds = pydicom.read_file(filenameDCM)
40     ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array
41 
42 
43 # 轴状面显示
44 # dpi是指每英寸的像素数,dpi越大,表示打印出来的图片越清晰。不是指图片的大小.
45 # 像素用在显示领域 分辨率用在打印领域 也就是你的图像是用来打印的时候才去考虑分辨率的问题
46 pyplot.figure(dpi=1000)
47 # 将坐标轴都变为同等长度
48 # pyplot.axes().set_aspect('equal', 'datalim')
49 pyplot.axes().set_aspect('equal')
50 # 将图片变为gray颜色
51 pyplot.set_cmap(pyplot.gray())
52 
53 pyplot.imshow(ArrayDicom[:, :, 360])# 第三个维度表示现在展示的是第几层 
54 pyplot.show() 
55
56 # 冠状面显示 
57 pyplot.figure(dpi=100) 
58 pyplot.axes().set_aspect('equal', 'datalim') 
59 pyplot.set_cmap(pyplot.gray()) 
60 pyplot.imshow(ArrayDicom[:, 90, :])
61 pyplot.show()

复制代码

 

结果如下:

轴状面:

冠状面:

 更多相关内容可以查看pydicom文档官网

5.DICOM的三个切面

如下图所示:是一个三维矩阵的模型,黄线一面区域是横断位面,蓝线一面区域是冠状面,红线一面区域是矢状面:

 

 

参考:https://pyscience.wordpress.com/2014/09/08/dicom-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-vtk/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多元有序logistic回归分析_一文详述:观察性研究中的logistic回归分析思路

本文内容来自《中华流行病学杂志》2019年第40卷第8期,作者为冯国双教授,原题目为《观察性研究中的logistic回归分析思路》。将这篇文章分享给医咖会的伙伴们,希望大家能从领域大咖的见解中有所收获,指导医学研究之路。&#xff08…

【转】禁用Chrome和Firefox中自动播放的动画GIF

动画GIF已经腐臭,并且在浏览时自动播放时可能会非常烦人。以下是如何阻止他们在Chrome和Firefox中自动播放。 禁用动画GIF Firefox 在地址栏中输入: about:config,然后按Enter。如果“这可能会使您的保修信息失效,请点击&#…

Python:Sklearn概述

文章来源:https://blog.csdn.net/algorithmPro/article/details/103045824 Sklearn (全称 Scikit-Learn) 是基于 Python 语言的机器学习工具。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单…

内存参数 计算_Spark统一内存管理的实现

本文从源码角度分析spark统一内存管理的实现原理。统一内存管理对象的创建统一内存管理对象在SparkEnv中进行创建和管理,这样内存管理就在Driver和Executor端中都可以使用。在SparkEnv的create函数中,创建内存管理对象的实现代码如下:val use…

Python:以鸢尾花数据为例,介绍决策树算法

文章参考来源: https://www.cnblogs.com/yanqiang/p/11600569.html https://www.cnblogs.com/baby-lily/p/10646226.html https://blog.csdn.net/liuziyuan333183/article/details/107399633 决策树算法 决策树算法主要有ID3, C4.5, CART这三种。 ID3算法从树的…

【转】CT球管小知识--热容量

Heat Unit 简称HU,为DR、CT等医疗设备中球管的热容量单位。如,Varian球管RAD14的热容量为300kHU。设备工作时,X线管两极之间要承受极高的电压,并通过一定量电流,高速电子束撞击阳极靶面,将产生大量热能。X线…

一键锁屏_ios快捷指令一键登录校园网(桂航为例,哆点认证)

(鄙人水平很有限,所学的专业也和此无关,文中有的东西可能会说错,但我尽量用简单的方式说。请多指教)现在很多高校现在晚上断电断网,最烦恼的事莫过于第二天早上起床眯着眼摸出手机输入账号密码登录校园网的…

【转】一篇文章完整了解CT成像技术(完整版)

1.CT的发明与发展 1.1 CT的发明 CT是计算机断层摄影术(Computed Tomography,CT)的简称,是继1895年伦琴发现X线以来,医学影像学发展史上的一次革命。 CT的发明可以追溯到1917年。当时,奥地利数…

Pandas数据可视化工具:图表工具-Seaborn

内容来源:https://www.jiqizhixin.com/articles/2019-01-30-15 简介 在本文中,我们将研究Seaborn,它是Python中另一个非常有用的数据可视化库。Seaborn库构建在Matplotlib之上,并提供许多高级数据可视化功能。 尽管Seaborn库可以…

图解WinCE6.0下的内核驱动和用户驱动

图解WinCE6.0下的内核驱动和用户驱动 在《WinCE驱动程序的分类》中曾提到&#xff0c;WinCE6.0的流驱动既可以加载到内核态也可以加载到用户态。下面通过一组图片简单说明一下这两种驱动的关系。 首先编写一个流驱动WCEDrv&#xff0c;代码如下。 代码 #include <windows.h&…

人体轮廓_女性人体油画轮廓柔和生动,优美动人,你喜欢吗?

人体油画是艺术和时代的产物&#xff0c;也是艺术结晶的重要体现&#xff0c;在文艺复兴以前&#xff0c;人体艺术大都以雕塑形式来表现&#xff0c;在此之后&#xff0c;人们都以意大利威尼斯绘画为代表&#xff0c;艺术家们开始以色彩塑造人体绘画艺术。随着时代进步和人们对…

机器学习分类模型中的评价指标介绍:准确率、精确率、召回率、ROC曲线

文章来源&#xff1a;https://blog.csdn.net/wf592523813/article/details/95202448 1 二分类评价指标 准确率&#xff0c;精确率&#xff0c;召回率&#xff0c;F1-Score&#xff0c; AUC, ROC, P-R曲线 1.1 准确率&#xff08;Accuracy&#xff09; 评价分类问题的性能指标…

【转】AI-900认证考试攻略

架构师的信仰系列文章&#xff0c;主要介绍我对系统架构的理解&#xff0c;从我的视角描述各种软件应用系统的架构设计思想和实现思路。 从程序员开始&#xff0c;到架构师一路走来&#xff0c;经历过太多的系统和应用。做过手机游戏&#xff0c;写过编程工具&#xff1b;做过…

300plc与组态王mpi通讯_S7-300与S7-200之间的MPI通信

通信说明S7-200PLC与S7-300PLC之间采用MPI通讯方式时&#xff0c;S7-200PLC中不需要编写任何与通讯有关的程序&#xff0c;只需要将要交换的数据整理到一个连续的V 存储区当中即可&#xff0c;而S7-300PLC中需要在组织块OB1(或是定时中断组织块OB35)当中调用系统功能X_GET(SFC6…

ORA-01114: 将块写入文件 35 时出现 IO 错误

参考文档&#xff1a; https://blog.csdn.net/z_x_1000/article/details/17263077 https://www.cnblogs.com/login2012/p/5775602.html https://www.iteye.com/blog/yangyangcom-2200174 一、问题背景 最开始发现应用服务打不开&#xff0c;于是登录服务器发现Oracle数据关…

【转】CT影像文件格式DICOM详解

CT影像文件格式DICOM详解 DICOM简介 DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;即医学数字成像和通信&#xff0c;是医学图像和相关信息的国际标准&#xff08;ISO 12052&#xff09;。DICOM被广泛应用于放射医疗&#xff0c;心血管成像以…

fatal error lnk1120: 1 个无法解析的外部命令_3月1日七牛云存储割韭菜的应对方法...

前言早上起来看邮件&#xff0c;看到一封被七牛云割韭菜的公告&#xff1a;内心冰冰凉&#xff0c;不过大家都要吃饭的嘛总不能一直免费下去。所以来研究一下对于我们这种穷人应该如何应对。一、七牛CDN加速流程主要流程分析1、用户通过浏览器访问我的网站(腾讯云服务器)&#…

【转】DCM(DICOM)医学影像文件格式详解

1、 什么是DICOM&#xff1f; DICOM(DigitalImaging andCommunications inMedicine)是指医疗数字影像传输协定&#xff0c;是用于医学影像处理、储存、打印、传输的一组通用的标准协定。它包含了文件格式的定义以及网络通信协议。DICOM是以TCP/IP为基础的应用协定&#xff0c;并…

SM4对称加密算法及Java实现

文章来源&#xff1a;https://www.jianshu.com/p/5ec8464b0a1b 一、简介 与DES和AES算法类似&#xff0c;SM4算法是一种分组密码算法。 其分组长度为128bit&#xff0c;密钥长度也为128bit。 加密算法与密钥扩展算法均采用32轮非线性迭代结构&#xff0c;以字&#xff08;32位…

【转】DICOM网络协议(一)概述

转自&#xff1a;https://www.jianshu.com/p/8a0f0fe6a738 作者&#xff1a;我住的城市没有福合埕 DICOM (Digital Imaging and Communications in Medicine)即医学数字成像和通信&#xff0c;DICOM网络是基于TCP/IP的网络协议。通过DICOM将影像设备和存储管理设备连接起来。…