Как мне отредактировать и сохранить размер вокселя и соответствующий аффин 3D-объема в формате Nifti в python?

Я изменяю размер вокселя некоторых трехмерных томов. Как мне отредактировать pixdim поле и рассчитать новый affine?

У меня есть некоторые объемы MR, которые являются анизотропными, размеры вокселя, скажем, 0.5 x 0.5 x 3 мм. И у меня есть некоторый код для интерполяции их в изотропный (например, 0.5 x 0.5 x 0.5 мм размер вокселя) объемы. Проблема в том, что когда мне нужно сохранить файл, мне нужно вычислить аффинное отображение, чтобы сопоставить теперь более плотные вокселы в пространстве ijk со ссылкой на пространство xyz. Как я могу это сделать?

Во-первых, моя мысль - использовать старый аффин и вычислить новый аффин.

Например, если том V имеет форму 256 x 256 x 20 воксели с 0.5 x 0.5 x 3 размер вокселя и интерполированный в объем U 256 x 256 x 120 воксели с 0.5 x 0.5 x 0.5 voxelsize.

Старый аффин будет делать [255 255 19]OA = [X Y Z] и новый аффин должен делать [255 255 119]NA = [X Y Z] и мы знаем AX=B X=inverse(A)B,

Так что новый аффин должен быть inverse([255 255 119])[X Y Z], Однако обратная матрица существует только для квадратной матрицы. Там не будет такой вещи inverse([255 255 119]),

И похоже нет set_voxel_size функция в Python-Nibabel Matlab-Nifti-Toolbox и так далее. Как это так?

Как я могу явно изменить размер вокселя?

0 ответов

В настоящий момент я столкнулся с аналогичной проблемой. Чтобы решить эту проблему, я создаю отличный заголовок с нуля с изотропными вокселями 0,5 мм и желаемой формой. Ты можешь использовать header.set_zooms() для установки размера вокселя в мм.

import nibabel as nib
import numpy as np

hdr = nib.Nifti1Header()
hdr.set_data_shape((256, 256, 120))
hdr.set_zooms((0.5, 0.5, 0.5))  # set voxel size
hdr.set_xyzt_units(2)  # millimeters
dst_aff = hdr.get_best_affine()

src_aff = np.eye(4)
src_aff_inv = np.linalg.inv(src_aff)

transform = np.matmul(src_aff_inv, dst_aff)
Другие вопросы по тегам