0

我使用此代码调整 3d nifti 数据的大小,但是当我检查结果时,我发现它很乱并且轴已更改

import numpy as np
import nibabel as nib
import itertools

initial_size_x = 560
initial_size_y = 560
initial_size_z = 240

new_size_x = 512
new_size_y = 512
new_size_z = 216

initial_data = nib.load("id001-512x512x216.nii.gz-pred.nii").get_data()
print('helooooooooooooooooooo')
delta_x = initial_size_x/new_size_x
delta_y = initial_size_y/new_size_y
delta_z = initial_size_z/new_size_z

new_data = np.zeros((new_size_x,new_size_y,new_size_z))

for x, y, z in itertools.product(range(new_size_x),
                                 range(new_size_y),
                                 range(new_size_z)):
    new_data[x][y][z] = initial_data[int(x*delta_x)][int(y*delta_y)][int(z*delta_z)]

img = nib.Nifti1Image(new_data, np.eye(4))
img.to_filename("test_"+str(new_size_x)+""+str(new_size_y)+""+str(new_size_z)+".nii")

在此处输入图像描述

4

1 回答 1

1

在这个问题中,我相信你想稍微改变一下 3D 数据的分辨率。我提出的解决方案仅适用于将数据放大或缩小整数倍。

为了扩大数据,您可以使用np.repeat和缩小数据,您可以使用切片。例如,这里我们可以写:

import numpy as np
import nibabel as nib
import itertools

initial_size_x = 560
initial_size_y = 560
initial_size_z = 240

new_size_x = 1120
new_size_y = 1120
new_size_z = 720

initial_data = nib.load("id001-512x512x216.nii.gz-pred.nii").get_data()

rep_x = new_size_x/initial_size_x # 2
rep_y = new_size_y/initial_size_y # 2
rep_z = new_size_z/initial_size_z # 3

new_data = np.repeat(initial_data, rep_x, axis=0)
new_data = np.repeat(new_data, rep_y, axis=1)
new_data = np.repeat(new_data, rep_z, axis=2)

可能的改进

我相信这个答案可以改进。但是,我不确定您从浮点重复中想到了什么。

例如,应该my_repeat(data, 0.9, axis=axis)跳过每 10 个元素吗?

于 2020-01-09T02:54:59.397 回答