nii与nii.gz格式的关系
标准NIfTI图像的扩展名是.nii,包含了头文件及图像资料。由于NIfTI格式和Analyze格式的关系,因此NIfTI格式也可使用独立的图像文件[.img]和头文件[.hdr]。单独的.nii格式文件的优势就是可以用标准的压缩软件[如gzip],而且一些分析软件包[比如FSL]可以直接读取和写入压缩的.nii文件[扩展名为.nii.gz]。
简而言之,nii格式和.nii.gz格式是一个东西,freesurfer中可以直接调用除了dicom和.nii.gz也可以直接调用.nii
3D slicer, MITK默认会将医学图像保存为格式为NRRD的图像,但是我们还是习惯于操作NIFTI格式的数据,于是就有了NRRD转换成NIFTI的需求。
代码中baseDir可以修改成指定的目录,files里面*后面的部分,改为自己匹配的文件名。
import os
from glob import glob
import numpy as np
import vtk
def readnrrd(filename):
"""Read image in nrrd format."""
reader = vtk.vtkNrrdReader()
reader.SetFileName(filename)
reader.Update()
info = reader.GetInformation()
return reader.GetOutput(), info
def writenifti(image,filename, info):
"""Write nifti file."""
writer = vtk.vtkNIFTIImageWriter()
writer.SetInputData(image)
writer.SetFileName(filename)
writer.SetInformation(info)
writer.Write()
if __name__ == '__main__':
baseDir = os.path.normpath(r'G:/aurora-nrrd/')
files = glob(baseDir+'/*label.nrrd')
for file in files:
m, info = readnrrd(file)
writenifti(m, file.replace('label.nrrd', 'label.nii'), info)
import SimpleITK as sitk
labelImage = sitk.ReadImage(in_file) #in_file是nii.gz文件的路径
imag_results = sitk.GetArrayFromImage(labelImage)
spacing = labelImage.GetSpacing()
origin = labelImage.GetOrigin()
print('spacing is:', spacing) # spacing和orgin是写入的内容
print('origin is:', origin)
nii.gz格式是医学图像常用的压缩格式,python中可用nibabel和sitk来读取保存。
使用nibabel
由于使用nibabel图像会旋转90度,所以读取保存的时候还得保存映射信息,3维图像格式为(z, x, y)
读取nii.gz文件
img = nib.load('xxxxx.nii.gz')
img_affine = img.affine
img = img.get_data()
保存nii.gz文件
nib.Nifti1Image(img,img_affine).to_filename('xxxxx.nii.gz')
使用sitk
使用sitk读取nii时,读取出来的还是图片格式,可以使用他自带的函数进行处理,不过速度比较慢,建议使用GetArrayFromImage转换成numpy格式再处理,3维图像格式为(x, y, z)
读取nii.gz文件
img = sitk.ReadImage('xxxxx.nii.gz')
img = sitk.GetArrayFromImage(img)
保存nii.gz文件
out = sitk.GetImageFromArray(img)
sitk.WriteImage(out,'xxxxx.nii.gz')
在numpy数组和nibabel或sitk中相互转换时,要注意数据的格式,一般保存为int或uint类型。比如输入nii为16位有符号整型时,我们可能需要转换成0~255灰度图,可用如下代码:
img = sitk.ReadImage('xxxxx.nii.gz')
img = sitk.Cast(sitk.RescaleIntensity(img),sitk.sitkUInt8)
img = sitk.GetArrayFromImage(img)