3

我有一个要迭代的 3D numpy 数组。如果它很重要,这是一个 .nii 文件类型(用于存储 MRI 大脑数据的文件),我使用 nipy 模块加载这些图像,然后可以将其作为 numpy 数组处理以进行图像处理。我想通过体素,只包括值<2的体素。这是我的尝试

import nipy

import numpy   

img = nipy.load_image('image.nii.gz')

img_manip = img.get_data()

result = numpy.zeros(shape = img_manip.shape, dtype = img_manip.dtype) 

for matrix in img_manip:

    for row in matrix:

        for item in row:

            if item < 2:

                result += img_manip

这似乎可以工作,但是它非常慢,就像它现在仍在运行一样。我只是想知道,这是正确的方法吗?我应该改用 np.empty 吗?我不确定我在 python 上还是很菜鸟。

编辑:仅供参考,img_manip 的形状类似于 (368, 170, 32),数据类型为 float64

(对不起,我不知道如何让代码看起来像“pythonic”!)

4

2 回答 2

3

我再次找到了解决问题的方法!哈哈,好吧,所以它可能不是完美的,但它可以完成工作。如果有人有更优雅的方法,请分享!顺便说一句,这不是我的解决方案,我实际上询问了 nipy 邮件列表,他们很乐意帮助我。无论如何,他们建议我利用 numpy 的索引系统。所以你会说:

img_manip[img_manip > 2] = 0
result = 15000 * img_manip #This is optional, just makes it into a nicer range for my purposes

现在对于那些感兴趣的人,如果你想回到 .nii 格式,你可以使用 nifti 包,看这里,那么你就简单地做

new_img = nifti.NiftiImage(result)

并保存您的输出!

编辑:您也可以通过以下方式使用 nibabel(并且您可能应该因为它得到进一步支持/开发):

new_img = nib.NiftiImage(result)
于 2013-06-20T19:50:36.903 回答
1

这是原始问题的潜在解决方案,使用nibabeland numpy

import nibabel as nib
import numpy as np
img = nib.load('image.nii.gz')
data = nib.get_data()
data[data>2] = np.nan  # If you really don't want to look at these...
nib.Nifti1Image(data, img.get_affine()).to_filename('new_image.nii.gz')
于 2014-05-01T11:29:42.533 回答