python对DICOM图像的读取方法详解


Posted in Python onJuly 17, 2017

DICOM介绍

DICOM3.0图像,由医学影像设备产生标准医学影像图像,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。在数以万计的在用医学成像设备中,DICOM是部署最为广泛的医疗信息标准之一。当前大约有百亿级符合DICOM标准的医学图像用于临床使用。

看似神秘的图像文件,究竟是如何读取呢?网上随便 一搜,都有很多方法,但缺乏比较系统的使用方法,下文综合百度资料,结合python2.7,讲解如何读取及使用DICOM图像。

读取DICOM图像,需要以下几个库:pydicom、CV2、numpy、matplotlib。pydicom专门处理dicom图像的python专用包,numpy高效处理科学计算的包,依据数据绘图的库。

安装:

pip install matplotlib
pip install opencv-python #opencv的安装,小度上基本都是要下载包,安装包后把包复制到某个文件夹下,
#后来我在https://pypi.python.org/pypi/opencv-python找到这种pip的安装方法,亲测可用
pip install pydicom
pip install numpy

如果没有记错,安装pydicom时,也会自动把numpy安装上。

安装好这些库后,就可以对dicom文件操作。

具体看下面代码:

#-*-coding:utf-8-*-
import cv2
import numpy
import dicom
from matplotlib import pyplot as plt

dcm = dicom.read_file("AT0001_100225002.DCM")
dcm.image = dcm.pixel_array * dcm.RescaleSlope + dcm.RescaleIntercept

slices = []
slices.append(dcm)
img = slices[ int(len(slices)/2) ].image.copy()
ret,img = cv2.threshold(img, 90,3071, cv2.THRESH_BINARY)
img = numpy.uint8(img)

im2, contours, _ = cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
mask = numpy.zeros(img.shape, numpy.uint8)
for contour in contours:
 cv2.fillPoly(mask, [contour], 255)
img[(mask > 0)] = 255


kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2))
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)


img2 = slices[ int(len(slices)/2) ].image.copy()
img2[(img == 0)] = -2000


plt.figure(figsize=(12, 12))
plt.subplot(131)
plt.imshow(slices[int(len(slices) / 2)].image, 'gray')
plt.title('Original')
plt.subplot(132)
plt.imshow(img, 'gray')
plt.title('Mask')
plt.subplot(133)
plt.imshow(img2, 'gray')
plt.title('Result')
plt.show()

在DICOM图像里,包含了患者的相关信息的字典,我们可以通过dir查看DICOM文件有什么信息,可以通过字典返回相关的值。

import dicom
import json
def loadFileInformation(filename):
 information = {}
 ds = dicom.read_file(filename)
 information['PatientID'] = ds.PatientID
 information['PatientName'] = ds.PatientName
 information['PatientBirthDate'] = ds.PatientBirthDate
 information['PatientSex'] = ds.PatientSex
 information['StudyID'] = ds.StudyID
 information['StudyDate'] = ds.StudyDate
 information['StudyTime'] = ds.StudyTime
 information['InstitutionName'] = ds.InstitutionName
 information['Manufacturer'] = ds.Manufacturer
 print dir(ds)
 print type(information)
 return information

a=loadFileInformation('AT0001_100225002.DCM')
print a

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python动态参数用法实例分析
May 25 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
python的文件操作方法汇总
Nov 10 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
python实现发送form-data数据的方法详解
Sep 27 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 Python
Python中基础数据类型 set集合知识点总结
Aug 02 Python
基于Python实现股票收益率分析
Apr 02 Python
Python实现excel转sqlite的方法
Jul 17 #Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 #Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 #Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 #Python
Python 的类、继承和多态详解
Jul 16 #Python
PyQt 线程类 QThread使用详解
Jul 16 #Python
Pycharm技巧之代码跳转该如何回退
Jul 16 #Python
You might like
用PHP编写PDF文档生成器
2006/10/09 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
webpack实用小功能介绍
2018/01/02 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
用Python创建声明性迷你语言的教程
2015/04/13 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python的exec、eval使用分析
2017/12/11 Python
Python切片操作实例分析
2018/03/16 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
python线程优先级队列知识点总结
2021/02/28 Python
播音主持女孩的自我评价分享
2013/11/20 职场文书
数控技校生自我鉴定
2014/03/02 职场文书
婚内分居协议书范文
2014/11/26 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python
Golang的继承模拟实例
2021/06/30 Golang
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android