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

Старое аффинное будет делать [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]) не будет.

И похоже, что в python-nibabel matlab-nifti-toolbox и так далее нет функции set_voxel_size. Как это дело?

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


person kaltu    schedule 20.04.2019    source источник


Ответы (1)


В настоящий момент я столкнулся с аналогичной проблемой. Чтобы решить эту проблему, я создаю отличный заголовок с нуля с изотропными вокселями 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)
person jakub    schedule 08.12.2019
comment
Спасибо за ответ, как изменить размер. Но этот способ по-прежнему отбрасывает аффинную функцию, которая отображает координату вокселя обратно в координату сканера. - person kaltu; 12.05.2021