pydicom和SimpleITK分别解析医学影像中dicom⽂件
⾸先,⽆论是pydicom还是SimpleITK都是需要事先导⼊到python中的库,如果使⽤的是pycharm IDE,可以先创建python3的虚拟环境,然后在虚拟环境下通过file-setting-Project interpreter ,在添加模块⾥⾯直接搜上述两个库的名称,点击安装即可。
pydicom提取单张dicom图像
numpy教程pdf1import pydicom
2from matplotlib import pyplot
3
4 ds = ad_file('C:/Users/****/Desktop/CT000000.dcm')# DICOM⽂件的位置
5print(ds.dir()) # 打印所有 DICOM TAG 名
6print(ds.dir('Pixe')) # 打印包含 'pat' 的 DICOM TAG
7print(ds.PatientName, ds.PatientSex, ds.PatientID, ds.PatientBirthDate, ds.PatientAge) # 打印 DICOM TAG 相应的属性值
8print(ds.data_element('PatientName')) # 打印⼀个完整的数据元素,包括 DICOMTAG编码值(Group, Element), VR, Value
9print(ds.data_element('PatientID').VR, ds.data_element('PatientID').value)
10 pixel_bytes = ds.PixelData # 原始⼆进制⽂件
11
12 pix = ds.pixel_array      # 像素值矩阵
13print(pix.shape) # 打印矩阵维度
14 pyplot.imshow(pix, bone)
15 pyplot.show() # cmap 表⽰ colormap,可以是设置成不同值获得不同显⽰效果,打印dicom图⽚
注意,此时可能会报错,报错的地⽅是ds.pixel_array,原因是某些格式的dicom⽂件不能⽤pydicom提取,。
pydicom提取序列dicom图像
1import pydicom
2import numpy
3from matplotlib import pyplot
4
5# ⽤lstFilesDCM作为存放DICOM files的列表
6 PathDicom = "D:/dicom_image/V"# 与python⽂件同⼀个⽬录下的⽂件夹
7 lstFilesDCM = []
8
9# 将所有dicom⽂件读⼊
10for diName, subdirList, fileList in os.walk(PathDicom):
11for filename in fileList:
12if".dcm"in filename.lower():  # 判断⽂件是否为dicom⽂件
13print(filename)
14            lstFilesDCM.append(os.path.join(diName, filename))  # 加⼊到列表中
15
16## 将第⼀张图⽚作为参考图
17 RefDs = ad_file(lstFilesDCM[10])  # 读取第⼀张dicom图⽚
18# print(RefDs)
19# print(RefDs.pixel_array)
20# print(RefDs.PatientPosition)
21 pyplot.imshow(RefDs.pixel_array, bone)
22 pyplot.show()
23
24# 建⽴三维数组,分别记录长、宽、层数(也就是dicom数据个数)
25 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM))
26print(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])  #
37print(len(x),"xxxx")
38
39 ArrayDicom = s(ConstPixelDims, dtype=RefDs.pixel_array.dtype)
40
41# 遍历所有的dicom⽂件,读取图像数据,存放在numpy数组中
42for filenameDCM in lstFilesDCM:
43    ds = ad_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_ay())
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_ay())
63 pyplot.imshow(ArrayDicom[:, 90, :])
64 pyplot.show()
SimpleITK打开单张dicom图像
1import SimpleITK as sitk
2import numpy as np
3from matplotlib import pyplot
4
5 file = sitk.ReadImage('C:/Users/****/Desktop/CT1227429.dcm')
6print(file.GetSize())
7print(file.GetOrigin()) # 坐标原点
8print(file.GetSpacing()) # 像素间距
9print(file.GetDirection()) # ⽅向
10 pixel_array = sitk.GetArrayFromImage(file) # 像素矩阵
11print(pixel_array.shape) # 打印矩阵维度
12 image_array = np.squeeze(pixel_array)
13print(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)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。