SimpleITK基本概念

SimpleITKITK的简化接口,有多种语言接口,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) # (z,y,x): z:切片数量,y:切片宽,x:切片高

第二种方法

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) #(z,x,y) 和上面不同

读取单个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) #(z,y,x) 这里的z = 1,因为只读取了一张slice
```

也可以只读取图片的一些特定信息:
```python
import SimpleITK as sitk
image = sitk.ReadImages(slice_path)
image.GetSize()
image.GetOrigin() # 得到的坐标顺序是 (x,z,y)
image.GetSpacing() # 得到的坐标顺序是 (x,z,y)
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) # -->[0,255]
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) # 并提取像素值(-1200~500)
normalize_255(img_array) # 将数值映射到(0~255)
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])

参考博客