Pydicom是一个用于处理DICOM格式文件的Python包,可以处理包括如医学图像(CT等)、报告等。
Pydicom支持DICOM格式的读取:可以将dicom文件读入python结构,同时支持修改后的数据集可以再次写入DICOM格式文件。但需要注意,它不是被设计为查看图像,主要是用来操作DICOM文件的各种数据元素。
PyDicom的安装
支持PIP和Conda安装,因此非常方便。以Anaconda安装为例:
conda install pydicom --channel conda-forge
读取Dicom文件
导入PyDicom包
import pydicom
读取一个dicom文件并显示
ds = pydicom.dcmread(file)
plt.figure(figsize=(10, 10))
plt.imshow(ds.pixel_array, cmap=plt.cm.bone)
plt.show()
一个完整的CT图像预处理的例子
对于CT图像,通常以患者的一次拍摄为一个文件夹,文件夹下有一序列的dicom文件,每个文件称为一个切片(slice)。但是每个患者的情况不同,所以slice间的间距不同,并且可能slice的排序也不同,因此需要在训练数据前做预处理。
这里参考Kaggle中的处理肺部照片的一个Kernel,对使用PyDicom处理CT图像做一个介绍参考评论里的反馈,这里将Kernel的Link以卡片形式放出:Full Preprocessing Tutorial | Kagglewww.kaggle.com
1、导入libraries,将所有患者的目录列出来:
%matplotlib inline
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import dicom
import os
import scipy.ndimage
import matplotlib.pyplot as plt
from skimage import measure, morphology
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
# 包含所有患者目录的根目录
INPUT_FOLDER = '../input/sample_images/'
patients = os.listdir(INPUT_FOLDER)
patients.sort()
2、扫描一个患者的目录,加载所有的切片,按切换的z方向排序切片,并获取切片厚度
def load_scan(path):
slices = [dicom.read_file(path + '/' + s) for s in os.listdir(path)]
slices.sort(key = lambda x: float(x.ImagePositionPatient[2]))
try:
slice_thickness = np.abs(slices[0].ImagePositionPatient[2] - slices[1].ImagePositionPatient[2])
except:
slice_thickness = np.abs(slices[0].SliceLocation - slices[1].SliceLocation)
for s in slices: