Как мне отредактировать и сохранить размер вокселя и соответствующий аффин 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)