Dicom文件转mhd,raw文件格式

最近在整理与回顾刚加入实验室所学的相关知识,那会主要是对DICOM这个医疗图像进行相应的研究,以前有一篇博客已经讲述了一些有关DICOM的基本知识,今天这篇博客就让咱们了解一下如何将Dicom文件转为mhd,raw文件格式。python

 


 

1、将Dicom文件转mhd,raw文件格式的缘由数组

医学图像一般是经过dicom文件格式进行存储的,但为了便于读取和使用也经常将其转化为:每一个病人一个mhd文件和一个同名的raw文件的格式mhd即meta header data,数据头部信息,raw存储了像素信息。以下图所示:app

2、利用python+SimpleITK完成上述过程的转换工具

其中mhd文件存储了dicom的头部信息,因为头部信息不少生成mhd的方法有所不一样,因此这里展现了经过ITK(ITK是美国国家卫生院下属的国立医学图书馆开发的一款医学图像处理软件包,是一个开源的、跨平台的影像分析扩展软件工具。)产生mhd文件的文件内容(利用写字板打开),有如下头部信息:学习

 

如下为实现的代码,附着详细的代码注释:spa

 

 1 import cv2
 2 import os
 3 import pydicom
 4 import numpy
 5 import SimpleITK
 6 
 7 # 路径和列表声明
 8 # 与python文件同一个目录下的文件夹,存储dicom文件,该文件路径最好不要含有中文
 9 PathDicom = "D:/dicom_image/V"
10 # 与python文件同一个目录下的文件夹,用来存储mhd文件和raw文件,该文件路径最好不要含有中文
11 SaveRawDicom = "D:/dicom_image/V/SaveRaw"
12 lstFilesDCM = []
13 
14 # 将PathDicom文件夹下的dicom文件地址读取到lstFilesDCM中
15 for dirName, subdirList, fileList in os.walk(PathDicom):
16     for filename in fileList:
17         if ".dcm" in filename.lower():  # 判断文件是否为dicom文件
18             print(filename)
19             lstFilesDCM.append(os.path.join(dirName, filename))  # 加入到列表中
20 
21 # 第一步:将第一张图片做为参考图片,并认为全部图片具备相同维度
22 RefDs = pydicom.read_file(lstFilesDCM[0])  # 读取第一张dicom图片
23 
24 # 第二步:获得dicom图片所组成3D图片的维度
25 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM))  # ConstPixelDims是一个元组
26 
27 # 第三步:获得x方向和y方向的Spacing并获得z方向的层厚
28 ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
29 
30 # 第四步:获得图像的原点
31 Origin = RefDs.ImagePositionPatient
32 
33 # 根据维度建立一个numpy的三维数组,并将元素类型设为:pixel_array.dtype
34 ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype)  # array is a numpy array
35 
36 # 第五步:遍历全部的dicom文件,读取图像数据,存放在numpy数组中
37 i = 0
38 for filenameDCM in lstFilesDCM:
39     ds = pydicom.read_file(filenameDCM)
40     ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array
41     cv2.imwrite("out_" + str(i) + ".png", ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)])
42     i += 1
43 
44 # 第六步:对numpy数组进行转置,即把坐标轴(x,y,z)变换为(z,y,x),这样是dicom存储文件的格式,即第一个维度为z轴便于图片堆叠
45 ArrayDicom = numpy.transpose(ArrayDicom, (2, 0, 1))
46 
47 # 第七步:将如今的numpy数组经过SimpleITK转化为mhd和raw文件
48 sitk_img = SimpleITK.GetImageFromArray(ArrayDicom, isVector=False)
49 sitk_img.SetSpacing(ConstPixelSpacing)
50 sitk_img.SetOrigin(Origin)
51 SimpleITK.WriteImage(sitk_img, os.path.join(SaveRawDicom, "sample" + ".mhd"))

 


以上就是本次学习的内容,欢迎你们交流与讨论。code

相关文章
相关标签/搜索