pydicom和SimpleITK分別解析醫學影像中dicom文件

首先,不管是pydicom仍是SimpleITK都是須要事先導入到python中的庫,若是使用的是pycharm IDE,能夠先建立python3的虛擬環境,而後在虛擬環境下經過file-setting-Project interpreter ,在添加模塊裏面直接搜上述兩個庫的名稱,點擊安裝便可。html

pydicom提取單張dicom圖像python

  

 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圖像app

 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圖像spa

 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)
相關文章
相關標籤/搜索