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 相关文章推荐
在Django的通用视图中处理Context的方法
Jul 21 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
python中比较两个列表的实例方法
Jul 04 Python
Python 进程之间共享数据(全局变量)的方法
Jul 16 Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
Python xlwings插入Excel图片的实现方法
Feb 26 Python
用Python爬取某乎手机APP数据
Jun 15 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 session
2013/10/28 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
js使用cookie记录用户名的方法
2015/11/26 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
详解利用Angular实现多团队模块化SPA开发框架
2017/11/27 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
讲解Python中fileno()方法的使用
2015/05/24 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
tensorflow 变长序列存储实例
2020/01/20 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
《青蛙看海》教学反思
2014/04/23 职场文书
公共场所标语
2014/06/30 职场文书
先进事迹演讲稿
2014/09/01 职场文书
布达拉宫导游词
2015/02/02 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
民事答辩状范本
2015/05/21 职场文书
汽车修理厂管理制度
2015/08/05 职场文书