nrrd文件格式转NIFTI

衡修洁
2023-12-01

1、NRRD批量转换成NIFTI

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)

参考:NRRD批量转换成NIFTI

2、Python SimpleITK读取nii.gz文件

 
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)

参考:Python SimpleITK读取nii.gz文件

3、nii.gz格式

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)

参考:python使用nibabel和sitk读取保存nii.gz文件

 类似资料: