医学图像处理(三):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')

NIfTI格式医学图像不同方向之间旋转

.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格式的关系

posted @ 2022-08-03 23:55  梅雨明夏  阅读(4231)  评论(0编辑  收藏  举报