Dicom简介:
医学数字成像和通信(DICOM)是存储和传输医学图像的标准,可以使用在多个制造商的医疗成像设备,如扫描仪,服务器,工作站,打印机,网络硬件以及图片存档和通信系统(PACS)上。它已被医院广泛采用,并正在进入更小的应用领域,如牙医和医生办公室。
DICOM文件可以在两个能够以DICOM格式接收图像和患者数据的实体之间交换。不同的设备带有DICOM一致性声明,它们明确说明了它们支持哪些DICOM类,标准包括文件格式定义和使用TCP / IP在系统之间进行通信的网络通信协议。
具体使用:
我目前处理的是CT图像,由于CT扫描是利用精确准直的X线束、γ射线、超声波等,与灵敏度极高的探测器一同围绕人体的某一部位作一个接一个的断面扫描,所以扫描后得到的图像是多层的图像,
所以扫描后得到的图像是一层层的图像,而我们把一层层的图像在z轴上堆叠起来就可以形成三维图像,这时,每一层的图像我们都可以存在dicom文件中(当然,dicom文件不是单纯的像素信息,它还有很多的数据头部信息),如下图,我们的目的就是要把在这些数据头部信息和像素信息从一系列dicom文件中读取出来。
我这里使用的是一个公开的数据集(点击这里即可下载),可以看到文件夹下有连续序号的dicom文件:
下面我们就用python来读取和显示dicom数据集:
首先,要导入以下几个必要的包, 在命令行输入:
pip install opencv-python
pip install pydicom
pip install numpy
pip install SimpleITK
pip install matplotlib
接着就是代码:
import os
import pydicom
import numpy
from matplotlib import pyplot
# 用lstFilesDCM作为存放DICOM files的列表
PathDicom = "./DicomResource/" #与python文件同一个目录下的文件夹
lstFilesDCM = []
for dirName,subdirList,fileList in os.walk(PathDicom):
for filename in fileList:
if ".dcm" in filename.lower(): #判断文件是否为dicom文件
print(filename)
lstFilesDCM.append(os.path.join(dirName,filename)) # 加入到列表中
## 将第一张图片作为参考图
RefDs = pydicom.read_file(lstFilesDCM[0]) #读取第一张dicom图片
# 建立三维数组
ConstPixelDims = (int(RefDs.Rows),int(RefDs.Columns),len(lstFilesDCM))
# 得到spacing值 (mm为单位)
ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
# 三维数据
x = numpy.arange(0.0, (ConstPixelDims[0]+1)*ConstPixelSpacing[0], ConstPixelSpacing[0]) # 0到(第一个维数加一*像素间的间隔),步长为constpixelSpacing
y = numpy.arange(0.0, (ConstPixelDims[1]+1)*ConstPixelSpacing[1], ConstPixelSpacing[1]) #
z = numpy.arange(0.0, (ConstPixelDims[2]+1)*ConstPixelSpacing[2], ConstPixelSpacing[2]) #
ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype)
# 遍历所有的dicom文件,读取图像数据,存放在numpy数组中
for filenameDCM in lstFilesDCM:
ds = pydicom.read_file(filenameDCM)
ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array
# 轴状面显示
pyplot.figure(dpi=300)
pyplot.axes().set_aspect('equal', 'datalim')
pyplot.set_cmap(pyplot.gray())
pyplot.pcolormesh(x, y, numpy.flipud(ArrayDicom[:, :, 9])) # 第三个维度表示现在展示的是第几层
pyplot.show()
"""
# 冠状面显示
pyplot.figure(dpi=300)
pyplot.axes().set_aspect('equal', 'datalim')
pyplot.set_cmap(pyplot.gray())
pyplot.pcolormesh(z, x, numpy.flipud(ArrayDicom[:, 150, :]))
pyplot.show()
"""
效果:
参考链接:
https://pyscience.wordpress.com/2014/09/08/dicom-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-vtk/