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实现的批量下载RFC文档
Mar 10 Python
python控制台中实现进度条功能
Nov 10 Python
python 网络编程详解及简单实例
Apr 25 Python
简单谈谈python中的语句和语法
Aug 10 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
Win10环境python3.7安装dlib模块趟过的坑
Aug 01 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
Python+Redis实现布隆过滤器
Dec 08 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
python语言的优势是什么
Jun 17 Python
python 第三方库paramiko的常用方式
Feb 20 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框架性能测试报告
2016/05/08 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
Javascript的&&和||的另类用法
2014/07/23 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
微信小程序自定义组件
2017/08/16 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
python简单文本处理的方法
2015/07/10 Python
bpython 功能强大的Python shell
2016/02/16 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
python匿名函数的使用方法解析
2019/10/10 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
酒店大堂副理的职责范文
2014/02/13 职场文书
政府门卫岗位职责
2014/04/29 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
停电调休通知
2015/04/16 职场文书
客户答谢会致辞
2015/07/30 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
浅谈Python数学建模之固定费用问题
2021/06/23 Python
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python