pydicom和SimpleITK分别解析医学影像中dicom文件

首先,无论是pydicom还是SimpleITK都是需要事先导入到python中的库,如果使用的是pycharm IDE,可以先创建python3的虚拟环境,然后在虚拟环境下通过file-setting-Project interpreter ,在添加模块里面直接搜上述两个库的名称,点击安装即可。

pydicom提取单张dicom图像

  

 1 import pydicom
 2 from matplotlib import pyplot
 3
 4 ds = pydicom.read_file(‘C:/Users/****/Desktop/CT000000.dcm‘)# DICOM文件的位置
 5 print(ds.dir()) # 打印所有 DICOM TAG 名
 6 print(ds.dir(‘Pixe‘)) # 打印包含 ‘pat‘ 的 DICOM TAG
 7 print(ds.PatientName, ds.PatientSex, ds.PatientID, ds.PatientBirthDate, ds.PatientAge) # 打印 DICOM TAG 相应的属性值
 8 print(ds.data_element(‘PatientName‘)) # 打印一个完整的数据元素,包括 DICOMTAG编码值(Group, Element), VR, Value
 9 print(ds.data_element(‘PatientID‘).VR, ds.data_element(‘PatientID‘).value)
10 pixel_bytes = ds.PixelData # 原始二进制文件
11
12 pix = ds.pixel_array       # 像素值矩阵
13 print(pix.shape) # 打印矩阵维度
14 pyplot.imshow(pix, cmap=pylab.cm.bone)
15 pyplot.show() # cmap 表示 colormap,可以是设置成不同值获得不同显示效果,打印dicom图片

注意,此时可能会报错,报错的地方是ds.pixel_array,原因是某些格式的dicom文件不能用pydicom提取,参考解答

pydicom提取序列dicom图像

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

SimpleITK打开单张dicom图像

  

 1 import SimpleITK as sitk
 2 import numpy as np
 3 from matplotlib import pyplot
 4
 5 file = sitk.ReadImage(‘C:/Users/****/Desktop/CT1227429.dcm‘)
 6 print(file.GetSize())
 7 print(file.GetOrigin()) # 坐标原点
 8 print(file.GetSpacing()) # 像素间距
 9 print(file.GetDirection()) # 方向
10 pixel_array = sitk.GetArrayFromImage(file) # 像素矩阵
11 print(pixel_array.shape) # 打印矩阵维度
12 image_array = np.squeeze(pixel_array)
13 print(image_array.shape) #
14 pyplot.imshow(image_array)
15 pyplot.show()

SimpleITK打开多张dicom图像

 1 reader = sitk.ImageSeriesReader()
 2 reader.MetaDataDictionaryArrayUpdateOn()#这一步是加载公开的元信息
 3 reader.LoadPrivateTagsOn()#这一步是加载私有的元信息
 4 series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(directorypath)#根据文件夹获取序列ID,一个文件夹里面通常是一个病人的所有切片,会分为好几个序列
 5 dicom_names = reader.GetGDCMSeriesFileNames( directorypath,series_ID)#选取其中一个序列ID,获得该序列的若干文件名
 6 reader.SetFileNames(dicom_names)#设置文件名
 7 image3D = reader.Execute()#读取dicom序列
 8 # 通过切片的索引来读取属于该切片的键,然后通过切片索引与键获取相应的值
 9 reader.GetMetaDataKeys(slice_index)
10 reader.GetMetaData(slice_index,key)

原文地址:https://www.cnblogs.com/jxblog/p/12010354.html

时间: 2024-10-10 12:59:40

pydicom和SimpleITK分别解析医学影像中dicom文件的相关文章

android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

1.下载工具 xstream 下载最新版本地址: https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/ 下载完成后 把jar包导入到自己的android项目中 2.asset 文件夹 下的 aa.xml 文件 <?xml version="1.0" encoding="UTF-8"?><product>    <name>

医学影像调窗技术

转自:http://www.cnblogs.com/assassinx/p/3139505.html 在年初的时候做过一个dicom格式文件解析,当时只是提了下.看着跟别人的显示出来也差不多 其实是我想太简单了.整理了下思路 这里提供正确的调窗代码. 医学影像 说得挺高科技的 其实在这个过程中本身没太复杂的图像处理技术.窗值处理就算是比较“高深”的了 也就是调窗.网上都是啥基于 DCMTK的DICOM医学图像显示及其调窗方法研究 说得文绉绉的 没啥鸟用 ,dicom没你想象的那么复杂哈 咱这个全

医疗时鲜资讯:谈谈“医学影像诊断&amp;熟人医患关系”

背景: 作为传统厂商,从入职到现在总算看到了公司试图转型的苗头,近期正在筹划一个在现有终端基础上的牙科影像分享和诊断平台,敬请期待. 这半年来好久没有记录相关的医疗资讯了,2014互联网医疗元年刚过,无论是投资方还是创业者都冷静了许多,私底下开始加紧谋划新产品.在大众胃口被调起来后,真正能够笼络和留住用户的是产品的体验.所以上半年的资讯略显平淡. 近几天看到了关于"影像结果低符合率"和"Dr.2关于'熟人医患'"的相关文章,还是有写点东西的冲动,遂整理成文,详情如下

js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) { var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '&qu

将一个路径进行标准化的解析, 防止路径中连续出现多个‘/’,以及防止路径中出现&#39;\&#39;, 防止路径结尾出现 &#39;/&#39;

由于不同系统,路径的信息表示不同,但是最后的处理却是使用同一格式的, 比如:输入的路径为:D:\\kassdev\\app-kaace\\classes\\com\\kass\\commons\\utils, 需要输出的路径信息为:D:/kassdev/app-kaace/classes/com/kass/commons/utils 以下的代码,对这种情况进行了处理 public static String parsePath(final String path){ if(path==null

【Python】解析Python中的文件操作

目录结构: contents structure [-] 简介 Python中的文件类型 内置函数的文件操作 open()函数 Mode 创建文本文件 读取文本文件 循环文件对象 关闭文件 With语句 os模块 fileinput模块 1.简介 在Python中无需引入额外的模块来进行文件操作,Python拥有内置的文件操作函数(除了内置文件操作函数,Python语言也提供了额外的文件操作模块,它们具有更加强大的功能). os模块提供了在操作系统上可移植的文件操作方法.如果只是想要读取和写入数

Dicom文件解析

Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理.只不过确实比较繁琐. 好了 正题 分析 整体结构先是128字节所谓的导言部分,说俗点就是没啥意义的破数据 跳过就是了,然后是dataElement依次排列的方式 就是一个dataElement接一个dataElement的方式排到文件结尾 通俗的讲dataElement就是指tag 就是破Dicom标准里定义的数据字典.tag是4个

DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”

背景: 续上篇,继续介绍如何将多幅JPG图像数据存入DCM文件.即将有损压缩数据直接写入DCM文件,存储为Multi-frame形式. 多幅JPG图像数据存入DCM文件: 为了避免引起歧义,这里着重说明一下.本博文的描述的场景是:假设我们手中有多张JPG文件,想把JPG文件写入DCM文件,即单个DCM文件包含多幅图像信息的Multi-Frame形式.该问题之前与CSDN博友y317215133y也讨论过,当时我在OFFIS论坛中找到了一个帖子直接给了y317215133y答复.今天重新梳理了一下

simpleitk打开dicom文件

ITK是一个功能很强大的医学图像处理公开库,搭配VTK用以显示图像,可以实现几乎所有医学图像处理的功能需要.ITK通常以C++包进行提供,当然也可以自己编译为Python包,不过编译过程比较繁琐耗时,而且很容易踩坑.但ITK官方进行的Python封装SimpleITK,则直接可以拿来使用:虽然有部分ITK的功能没有包含,但已基本够用了.我们在处理医学图像时,使用的基本都是SimpleITK. 本文就简单总结一下我们在处理这些图像时的经验,以便备忘,并为后来者参考. 1.读取文件 读取DICOM序