医学图像之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)、超声(分B超、彩色多普勒超声、心脏彩超、三维彩超)、核磁共振成像(MRI)、心电图仪器、脑电图仪器等
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个字节的字符串是否等于“DICM”来判断该文件是不是DICOM文件。
- 文件信息元素
有关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相关属性的打印
1 print(ds.dir()) # 打印所有 DICOM TAG 名 2 print(ds.dir('pat')) # 打印包含 'pat' 的 DICOM TAG 3 print(ds.PatientName, ds.PatientSex, ds.PatientSize, ds.PatientWeight ) # 打印 DICOM TAG 相应的属性值 4 print(ds.data_element('PatientID')) # 打印一个完整的数据元素,包括 DICOMTAG编码值(Group, Element), VR, Value 5 print(ds.data_element('PatientID').VR, ds.data_element('PatientID').value) 6 pixel_bytes = ds.PixelData # 原始二进制文件 7 pix = ds.pixel_array # 像素值矩阵 8 print(pix.shape) # 打印矩阵维度 9 pylab.imshow(pix, cmap=pylab.cm.bone) 10 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() 5556 # 冠状面显示 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/
以上为本次学习内容,欢迎交流
转载于:https://www.cnblogs.com/XDU-Lakers/p/9863114.html
医学图像之DICOM格式解析相关推荐
- 【转】医学图像之DICOM格式解析
最近导师给安排了新任务,由于刚进入实验室,对于医学图像这一块还一知半解,所以就想分享一下有关医学常见影像的学习资料(尤其是dicom后缀的图像文件),欢迎大家一起交流. 目录 1.医学影像学的介绍 2 ...
- 有关dicom格式医学影像的分析
一.Dicom简介 1.DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 1205 ...
- 【转】Dicom格式文件解析器!!!!!!!
转自:https://www.cnblogs.com/assassinx/archive/2013/01/09/dicomViewer.html Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通 ...
- 【转】Dicom文件解析!!!!!!
转自:https://blog.csdn.net/leaf6094189/article/details/8510325 Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*. ...
- Matlab批量转换dicom,基于Matlab的批量转换DICOM格式CT序列图像的实现
龙源期刊网 http://www.doczj.com/doc/25ac806b59fb770bf78a6529647d27284a733760.html 基于Matlab的批量转换DICOM格式CT ...
- 3D医学图像CT dcm格式转换为png
医学图像 CT dcm格式转换为png 在normalize_hu()中修改像素值,需要具体数据对象具体分析 只需要在main函数中更改dcm文件路径 """ 读取dic ...
- 常见的医学图像成像及存储格式解析
1.MRI.FMRI和DTI MRI:核磁共振(nuclear magnetic resonance,NMR)简称磁共振,核磁共振是一种物理现象.磁共振成像(MRI)是利用收集磁共振现象所产生的信号而 ...
- 医学图像数据格式和格式转换
医学图像数据格式和格式转换 本文转载自:http://blog.csdn.net/kingmicrosoft/article/details/35798249 由于最近碰到了数据格式的问题,重建不出效 ...
- 转:YUV RGB 常见视频格式解析
转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...
- 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )
文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...
最新文章
- [洛谷P4889]kls与flag
- jQuery实现父窗口的问题
- 实战SSM_O2O商铺_10【商铺注册】Service层的实现
- java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归...
- 时间和空间复杂度概述【Java _demo版】
- ListView条目中有CheckBox点击事件失效问题
- JAVA设计模式之【单例模式】
- 「声明」本博客自动采集于博客园-niceyoo
- for循环利用可迭代对象与迭代器完成工作的本质
- 神啊,6小时30分钟,完成想要的所有Lync测试
- openssl生成证书
- goalnd 分支合并完出现两个箭头
- mysql5.7.18-winx64安装
- Vue报错:sockjs.js?9be2:1627 GET http://192.168.43.88:8080/sockjs-node/info?t=1631603986586 net::ERR_CO
- Python和它高大上的插件们
- 从0-1背包问题到动态规划
- Android FrameWork浅识
- 彼岸花的传说——彼岸繁花,开一千年,落一千年,花叶不相见。情不为因果,缘注定生死。...
- 从零到一黑苹果教程(10.15Catalina)
- revit相关报错合集
热门文章
- bmob php修改数据,使用Bmob SDK实时数据功能的一次经历
- android4.4.2 以太网代理,Android2.3.4系统添加Ethernet框架支持
- mapper同时添加数据只能添加一条_神器之通用mapper的使用
- 动态规划之子串和(续。升级版)nyoj745
- 线性代数中矩阵相乘如何计算
- python中间件有哪些_python_21(Django中间件)
- redis 分布式锁 看门狗_为什么redis可以做分布式锁
- 有截图功能的android播放器,Android hls、rtsp录屏截屏直播播放器
- C语言——数据结构(线性,树形,图形结构等)
- SLAM--intel realsense2在ORB SLAM2 和 ORB SLAM3下建图和重定位(ubuntu 20.04, opencv 4.2.0 以上)