by HPC_ZY
由于工程需要,学习了python读取dicom和nii格式文件,这里分享利用SimpleITK和pydicom读取dicom文件的方法。
SimpleITK
## read a single dicom by simpleitk
import numpy as np
import SimpleITK as sitk
import matplotlib.pyplot as plt
%matplotlib inline
# read a dicom file
dicom = sitk.ReadImage(r"C:\data\1.dcm")
# show some infomation
print(dicom.GetSize())
print(dicom.GetOrigin())
print(dicom.GetSpacing())
print(dicom.GetDirection())
# get image array
image = np.squeeze(sitk.GetArrayFromImage(dicom))
# show image
plt.imshow(image,"gray")
plt.show()
## read a series dicom files by simpleitk
import numpy as np
import SimpleITK as sitk
import matplotlib.pyplot as plt
%matplotlib inline
filesPath = r"C:\data"
reader = sitk.ImageSeriesReader()
dicomFiles = reader.GetGDCMSeriesFileNames(filesPath)
reader.SetFileNames(dicomFiles)
dicom = reader.Execute()
image = sitk.GetArrayFromImage(dicom) # z,y,x
# show
for idx in range(0,5):
plt.imshow(image[idx,:,:],"gray")
plt.show()
pydicom
## read a single dicom by pydicom
import pydicom
import matplotlib.pyplot as plt
from matplotlib import pylab
PRINTFLAG = [0,0,0,0,0,0]
filePath = r"C:\data\1.dcm"
# read a dicom file
dicom = pydicom.read_file(filePath)
# show some tags
if PRINTFLAG[0]: # print all dicom tags
print(dicom.dir())
if PRINTFLAG[1]: # print all dicom tags with 'patient'
print(dicom.dir('patient'))
if PRINTFLAG[2]: # print specified dicom tags
print(dicom.PatientName, dicom.PatientSex, dicom.PatientID, dicom.PatientBirthDate, dicom.PatientAge)
if PRINTFLAG[3]: # print a complete tag,include(Group, Element),VR, Value
print(dicom.data_element('PatientName'))
if PRINTFLAG[4]: # print a specified element of a tag
print(dicom.data_element('PatientID').VR, dicom.data_element('PatientID').value)
if PRINTFLAG[5]: # get pixel element
pixelBytes = dicom.PixelData
# get the dicom image array
image = dicom.pixel_array
# show image
plt.imshow(image, cmap=pylab.cm.bone)
plt.show()
## read a series dicom files by pydicom
import os
import pydicom
import numpy as np
import matplotlib.pyplot as plt
filesPath = r"C:\data"
# get files name list
dicomFilesList = []
for root, dirs, files in os.walk(filesPath):
for filename in files: # default that all files are dicom
dicomFilesList.append(os.path.join(root, filename)) # append to list
# Use the first picture as a reference
ref = pydicom.read_file(dicomFilesList[0])
dicomSize = (int(ref.Rows), int(ref.Columns), len(dicomFilesList))
print(dicomSize) # size
voxelSize = (float(ref.PixelSpacing[0]), float(ref.PixelSpacing[1]), float(ref.SliceThickness))
print(voxelSize) # spacing(mm) Parameters required for reconstruction
# init 3D volumn
image = np.zeros(dicomSize, dtype=ref.pixel_array.dtype)
# read dicom series
for filenameDCM in dicomFilesList:
ds = pydicom.read_file(filenameDCM)
image[:, :, dicomFilesList.index(filenameDCM)] = ds.pixel_array
# show image
plt.imshow(image[:, :, 19]) # horizontal
plt.show()
plt.imshow(ArrayDicom[:, 90, :]) # frontal
plt.show()
plt.imshow(ArrayDicom[220, :, :]) # sagittal
plt.show()
其他
- 由于需求,只能用英文备注
- 后面还会分享读取nii的方法