
nii文件或者nii.gz文件是一种特殊的文件格式,可以存储叠加的切片数据或者时序数据,比如MRI头部矢状面扫描的所有切片,CT扫描图,多细胞时移图等等。对于nii文件的读取和存储也有许多的方法。
一般地,如果一个数组矩阵 ,想要保存成为nii文件:首先需要安装SimpleITK库或者nibabel库,由于nibabel库保存矩阵为nii文件时,会涉及到affine矩阵(一般的会设置为单位对角4*4矩阵),但是很多文件存储的affine坐标是有格式和规定的,所以在不知道保存文件affine矩阵的情况下,用nibabel保存可能会有点麻烦。
nibabel库详解:
Neuroimaging in Python - NiBabel 3.1.1 documentationnipy.orgSimpleITK库详解:
https://github.com/SimpleITK/SimpleITKgithub.com这里选择使用SimpleITK库保存矩阵为nii文件:
import SimpleITK as sitk
nii_file = sitk.GetImageFromArray(anno_mat)
# anno_mat 为一个矩阵,其维度必须是按照(样本数*高度*宽度)排列
否则,保存的结果错误
sitk.WriteImage(nii_file,nii_path) # nii_path 为保存路径这里需要特别注意保存的矩阵的维度排布。
接下来使用SimpleITK保存png图片为nii文件:
png图片的特点是4个通道,RGBA,最后一个通道是透明度,但是如果后续对保存的nii文件有和其他图片进行overlay的需求,需要剔除最后一个A 通道,否则会出现问题。
这里使用PIL库读取PNG图片:
from PIL import Image
import numpy as np
empt_mat=[]
for i in png_path:
img1=Image.open(i)
img2=np.array(img1)[:,:,0:3]
# 这里取png图片的前三个通道,去除第四个透明通道
方便后续的nii文件的处理
empt_mat.append(img2)
emp=np.array(empt_mat)
nii_file = sitk.GetImageFromArray(emp)
# 此处的emp的格式为样本数*高度*宽度*通道数
不要颠倒这些维度的顺序,否则文件保存错误
sitk.WriteImage(nii_file,nii_path) # nii_path 为保存路径
注意丢弃PNG图片的第四个通道
另外推荐一个3D slicer软件,专门用于nii切片文件的后续处理,比如对切片特定区域的标记,分割等等操作。
https://www.slicer.org/www.slicer.org
2812




被折叠的 条评论
为什么被折叠?



