Конвертирование файлов 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]])
Другие вопросы по тегам