Конвертирование файлов Nrrd в Nifti
Я хочу конвертировать ~1000 .nrrd
файлы в Nifit (.nii.gz
) формат. Я использую 3DSlicerResampleScalarVectorDWIVolume
модуль командной строки для выполнения этой задачи. Но этот процесс действительно медленный. Конвертирование каждого файла в моей системе занимает ~4 минуты. Мне было интересно, какой инструмент люди используют для таких конверсий?
3 ответа
Следующий код можно использовать для преобразования всех файлов ".nrrd" в папке в сжатый формат "nifti":
import os
from glob import glob
import nrrd #pip install pynrrd, if pynrrd is not already installed
import nibabel as nib #pip install nibabel, if nibabel is not already installed
import numpy as np
baseDir = os.path.normpath('path/to/file')
files = glob(baseDir+'/*.nrrd')
for file in files:
#load nrrd
_nrrd = nrrd.read(file)
data = _nrrd[0]
header = _nrrd[1]
#save nifti
img = nib.Nifti1Image(data, np.eye(4))
nib.save(img,os.path.join(baseDir, file[-8:-5] + '.nii.gz'))
Например, этот скрипт будет конвертировать abc.nrrd
а также xyz.nrrd
файлы в baseDir
в abc.nii.gz
а также xyz.nii.gz
соответственно.
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()
m, info = readnrrd('/media/neubias/b0c7dd3a-8b12-435e-8303-2c331d05b365/DATA/Henry_data/mri.nrrd')
writenifti(m, '/media/neubias/b0c7dd3a-8b12-435e-8303-2c331d05b365/DATA/Henry_data/mri_prueba2.nii', info)
Аналогично ответу avi.ks, но на случай, если кому-то понадобится сохранить информацию заголовка:
import glob
import nibabel as nib
import nrrd
# Get a list of .nrrd files in a directory
nrrd_files = glob.glob('path/to/nrrd/directory/*.nrrd')
# Loop through each .nrrd file
for nrrd_file in nrrd_files:
# Read the .nrrd file
data, header = nrrd.read(nrrd_file)
# Create a NIfTI1Image object
nifti_img = nib.Nifti1Image(data, affine=None)
# Update the NIfTI header with necessary information
nifti_img.header.set_data_dtype(data.dtype)
nifti_img.header.set_zooms(header['space directions'])
# Generate the output .nii file path by replacing the extension
nii_file = nrrd_file.replace('.nrrd', '.nii')
# Save the NIfTI1Image object as .nii file
nib.save(nifti_img, nii_file)
В этом коде я используюheader['space directions']
из заголовка .nrrd, чтобы установить расстояние между пикселями в заголовке NIfTI, используяnifti_img.header.set_zooms()
. Возможно, вам придется отрегулироватьheader['spcace direction']
измерение. В моем случае я меняю его на:
nifti_img.header.set_zooms([header['space directions'][0, 0],
header['space directions'][1, 1],
header['space directions'][2, 2]])