file_name = ["portalvein", "venoussystem", "venacava"] def read_dicom(path): lstFileDCM = [] for dirName, subdirList, fileList in os.walk(path): n = len(fileList) # print("n:", n) for i in range(n): filename = fileList[i] idx = filename.split("_")[-1] filename = filename.replace(str(idx), str(i)) lstFileDCM.append(os.path.join(dirName, filename)) # 读取第一张dicom图片 RefDs = pydicom.read_file(lstFileDCM[0]) # 得到dicom图片所组成3D图片的维度 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFileDCM)) print("ConstPixelDims:", ConstPixelDims) # (512,512,74)【这是我的一张示例图片输出的结果】 # 得到x方向和y方向的Spacing并得到z方向的层厚 ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness)) # (0.742187976837158, 0.742187976837158, 2.5)【这是我的一张示例图片输出的结果】 # 得到图像的原点 Origin = RefDs.ImagePositionPatient # [0, 0, 0]【这是我的一张示例图片输出的结果】 # 根据维度创建一个numpy的三维数组,并将元素类型设为:pixel_array.dtype ArrayDicom = np.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype) # 遍历所有的dicom文件,读取图像数据,存放在numpy数组中 i = 0 for filenameDCM in lstFileDCM: ds = pydicom.read_file(filenameDCM) ArrayDicom[:, :, lstFileDCM.index(filenameDCM)] = ds.pixel_array # 将文件按照png的格式写进当前目录 # cv2.imwrite(os.path.join(png_path, "out_" + str(i) + '.png'), ArrayDicom[:, :, lstFileDCM.index(filenameDCM)]) i += 1 # 对numpy数组进行转置,即把坐标轴(x,y,z)变换为(z,y,x),这样是dicom存储文件的格式,即第一个维度为z轴便于图片堆叠 ArrayDicom = np.transpose(ArrayDicom, (2, 0, 1)) return ArrayDicom,ConstPixelSpacing,Origin
具体将array转换成nii文件,看我的github
github
GitHub.