SimpleITK基本概念
SimpleITK
是ITK
的简化接口,有多种语言接口,python
版本安装pip install SimpleITK
,其官文文档为:SimpleITK文档
使用SimpleITK读取文件
医学图像中常用的格式有.dcm
,.nrrd
,.nii
,.mhd
,这几种格式的读取方式都是一样的。在这里主要介绍读取.dcm
格式的文件。SimpleITK读取.dcm
文件有两种方式:
- 传入文件夹路径,
SimpleITK
自动读取文件夹中所有.dcm
文件,返回一个slice数组
- 传入每个
slice
的路径,自己分别加载后再合并。
读取文件夹中所有DICOM序列
- 对于这种方法,即便dicom文件不是按照z轴顺序存储的,也可以得到自动按照z轴排序的文件
- 第一种方法和第二种方法得到的切片顺序是相反的
第一种方法
1 2 3 4 5 6 7
| import SimpleITK as sitk import numpy as np reader = sitk.ImageSeriesReader() dicom_names = reader.GetGDCMSeriesFileNames(path) reader.SetFileNames(dicom_names) image = reader.Execute() image_array = sitk.GetArrayFromImage(image)
|
第二种方法
1 2 3 4
| path = "" slice_read = [sitk.ReadImage(path+'/'+s) for s in os.listdir(path) if s.endswith('.dcm')] slice_read.sort(key=lambda x: float(x.GetOrigin()[2],reverse=True)) image = np.stack(sitk.GetArrayFromImage(slice) for slice in slice_read)
|
读取单个DICOM单张图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import SimpleITK as sitk import numpy as np image = sitk.ReadImages(slice_path) image_array = sitk.GetArrayFromImage(image) ```
也可以只读取图片的一些特定信息: ```python import SimpleITK as sitk image = sitk.ReadImages(slice_path) image.GetSize() image.GetOrigin() image.GetSpacing() image.GetDirection()
|
将dcm
数据存成.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| def window_pro(img,upper=500,lower=-1200): img[img>upper] = upper img[img<lower] = lower return img
def normalize_255(img): ymax = 255 ymin = 0 xmax = np.max(img) xmin = np.min(img) norm_img = np.asarray((ymax - ymin) * (img - xmin) / (xmax - xmin) + ymin, np.uint8) return norm_img
def get_dcm(dicom_dir): ''' 读取某文件夹内的所有dicom文件,并提取像素值(-1200~500),然后将数值映射到(0~255) :param src_dir: dicom文件夹路径 :return: image array ''' reader = SimpleITK.ImageSeriesReader() dicom_names = reader.GetGDCMSeriesFileNames(dicom_dir) reader.SetFileNames(dicom_names) image = reader.Execute() img_array = SimpleITK.GetArrayFromImage(image) window_pro(img_array) normalize_255(img_array) return img_array
def dcm2png(img_array,save_dir): ''' 读取某文件夹内的所有dicom文件,并提取像素值(-1200~500),然后将数值映射到(0~255) :param save_dir: 保存png文件路径 img_array: 通过get_dcm得到的dcm图片数组 :return: None ''' for i in range(img_array.shape[0]): Image.save(save_dir+"/"+str(i)+".png",img_array[i])
|
参考博客