Сохранение вектора со сложными компонентами в nifti-файле

Я генерирую 4D сложный массив numpy, например:

numpy_array = np.tile(np.array([3, 4, 0], dtype=np.complex64), (100,100,100,1))

я хочу сохранить массив numpy как файл nifti

Я пробовал использовать vtk и SimpleITK, но оба они не поддерживают комплексные числа (только векторы, которые являются действительными числами) Кажется, что только нибабель поддерживает сложные векторы, и мне удалось сохранить файл, но я могу загрузить его только с нибабелем, когда я пытаюсь загрузить его с помощью ITK-SNAP или слайсера, он не открывается. Я знаю, что ITK-SNAP может открывать сложный вектор файлов nifti, потому что у меня уже есть эти файлы, сохраненные с помощью другого скрипта с использованием Matlab.

import numpy as np
import nibabel as nib
import SimpleITK as sitk
import vtk
from vtk.util.numpy_support import numpy_to_vtk

numpy_array = np.tile(np.array([3, 4, 0], dtype=np.complex64), (100,100,100,1))

nibabel save попробуйте:

image = nib.Nifti2Image(numpy_array, affine=np.eye(4))
nib.save(image , r'file_name.nii')

Попробуйте сохранить SimpleITK:

image = sitk.GetImageFromArray(numpy_array)
sitk.writeimage(image, r'file_name.nii')

vtk save попробуйте:

array = np.concatenate((np.real(numpy_array), np.imag(numpy_array)), axis=3)
stacked_array = array.reshape(-1, array.shape[-1])
vtk_array = numpy_to_vtk(stacked_array, deep=True,                 
array_type=vtk.VTK_FLOAT)
vtk_image = vtk.vtkImageData()
vtk_image.SetDimensions(numpy_array.shape[0], numpy_array.shape[1], 
numpy_array.shape[2])
vtk_image.GetPointData().SetScalars(vtk_array)
writer = vtk.vtkNIFTIImageWriter()
writer.SetFileName(file_name)
writer.SetInputData(vtk_image)
writer.Write()

вывод нибабеля:

nibabel создает отличный файл с вектором, но с другими программами, такими как ITK-SNAP, он не открывается

Ошибка ITK-SNAP:

Error: Unsupported or missing image file format. ITK-SNAP failed to create an 
ImageIO object for the image 'file_name.nii' using format ''.

Ошибка SimpleITK:

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\SimpleITK\SimpleITK.py", line 3366, in _get_sitk_vector_pixelid
    return _np_sitk[numpy_array_type.dtype]
KeyError: dtype('complex64')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\ProgramData\Anaconda3\lib\site-packages\SimpleITK\SimpleITK.py", line 3431, in GetImageFromArray
    id = _get_sitk_vector_pixelid( z )
  File "C:\ProgramData\Anaconda3\lib\site-packages\SimpleITK\SimpleITK.py", line 3371, in _get_sitk_vector_pixelid
raise TypeError('dtype: {0} is not supported.'.format(numpy_array_type.dtype))
TypeError: dtype: complex64 is not supported.

выход vtk:

vtk создает векторный файл nifti, но с 6 компонентами вместо 3 (рассматривайте также и мнимую часть как компоненты), я видел в документации numpy_to_vtk, что он не поддерживает массивы copmlex, возможно, кто-то знает об обходном пути.


person Shay Levi    schedule 12.09.2019    source источник


Ответы (1)


Выпуск SimpleITK 1.2 поддерживает запись сложных изображений 4D. Отсутствует поддержка комплексного числа в stk.GetImageFromArray, но она уже добавлена ​​в ветку разработки, и ваш код работает, если вы используете скомпилированную версию текущей основной ветки SimpleITK или ждете выпуска 1.3, запланированного на октябрь 2019 года.

А пока вы можете преобразовать компоненты комплексных чисел в SimpleITK по отдельности следующим образом:

image = sitk.RealAndImaginaryToComplexImageFilter(sitk.GetImageFromArray(numpy_array.real), 
                                                  sitk.GetImageFromArray(numpy_array.imag)) 
sitk.WriteImage(image, r'file_name.nii')
person blowekamp    schedule 12.09.2019
comment
я предполагаю, что вы имели в виду использование 'sitk.RealAndImaginaryToComplex', я попытался использовать этот метод, но все еще получил ошибку: 'RuntimeError: исключение, выброшенное в SimpleITK RealAndImaginaryToComplex: c: \ miniconda3 \ envs \ bld \ conda-bld \ simpleitk_1563387058023 \ work \ code common \ include \ sitkMemberFunctionFactory.hxx: 196: sitk :: ERROR: Тип пикселя: вектор 64-битного числа с плавающей запятой не поддерживается в 3D byclass itk :: simple :: RealAndImaginaryToComplexImageFilter ' - person Shay Levi; 15.09.2019
comment
@ShayLevi, к сожалению, SimpleITK не поддерживает векторные сложные пиксели. - person Dave Chen; 17.09.2019