医学图像处理(三):nii和dcm格式读取与保存
.nii格式的读取与保存
注意两种方式读取维度的差异
1.nibabel
读取
import nibabel as nib
img = nib.load(path)
print(img.shape) # (z,y,x)
img_array = np.asarray(img.get_fdata())
print(img_array.shape) # (x,y,z)
保存
img = nib.Nifti1Image(img_array, np.eye(4))
nib.save(img, os.path.join('output', 'img.nii.gz')
关于get_data()和get_fdata()的区别:一个是返回原始数据,一个是返回浮点数
见神经影像学中的python的一些基本函数的用法
2.SimpleITK
读取
import SimpleITK as sitk
img = sitk.ReadImage(ct_path, sitk.sitkInt16) # 可自行改变存储类型
print(img.GetSize()) # (x,y,z)
img_array =sitk.GetArrayFromImage(img)
print(img_array.shape) # (z,y,x)
保存
out = sitk.GetImageFromArray(img_array)
sitk.WriteImage(out,'simpleitk_save.nii.gz')
将 numpy array 保存为 nii 格式图像之后,有时候会发现使用 itk-snap 却打不开,这是为什么呢?
因为 itk-snap 只接受 int16 类型的数据,所以你需要 将 numpy 数组先强制转换成 int16 类型。
array = array.astype(np.int16)
out = sitk.GetImageFromArray(array)
sitk.WriteImage(out,'save.nii.gz')
.dcm格式的读取
读取
# 采用pydicom模块
import pydicom
# 数据路径
file_path = r"C:\Users\os\Desktop\data\xxxxx.dcm"
# read_file
data0 = pydicom.read_file(file_path)
# file_data = data0.pixel_array
# print(file_data)
# dcmread
data1 = pydicom.dcmread(file_path)
读取dcm格式
分别采用了read_file和dcmread两种方式读取数据,两种方式读取效果相同
也可查询参数,自行参考链接
打印图片
借助numpy与PIL.Image
import numpy as np
data = np.array(data0.pixel_array)
from PIL import Image
data_img = Image.fromarray(data0.pixel_array)
data_img_rotated = data_img.rotate(angle=45,resample=Image.BICUBIC)
from matplotlib import pyplot
pyplot.imshow(data0.pixel_array,cmap=pyplot.cm.bone)
pyplot.show()
dcm和nii格式的互相转化
有对应的python代码可以转化
但是直接将.dcm重命名为.nii后仍然可以读取
.nii重命名为.nii.gz后仍然可以读取(也可通过gzip压缩后得到)
但是反过来.nii.gz重命名为.nii后不可读取
nii与nii.gz格式的关系