怎么改变nifti数据里面的矩阵数据再另存为新的.nii

1. 问题描述
我收到的标注文件是每个部位都存在一个.nii里,而且前景部分数值都为1,这样数据重复部分很多,而且后续深度学习写接口文件有些麻烦。所以想把同一个sample的不同部位的标签结果放在同一个.nii文件里。

 

2. 解决方案

# merge the annotation: because previously, each bone is stored in individual .nii and the value is 1 in all bones.
# merge the annotation files to one .nii
# different value for different bone


import nibabel as nib
import os
import numpy as np

out_path = r"path\annotations2"
patient_path = r"path\annotations_nii"
patients = os.listdir(patient_path)
for patient in patients:
    ann_files = ["LeftPelvis.nii.gz", "RightPelvis.nii.gz", "LeftFemur.nii.gz", "RightFemur.nii.gz"]
    ann_filename = (os.path.join(patient_path, patient, ann_files[0]))
    img = nib.load(ann_filename)
    data = np.asarray(img.dataobj)
    for i, ann_file in enumerate(ann_files):
        ann_filename0 = (os.path.join(patient_path, patient, ann_file))
        img0 = nib.load(ann_filename0)  # pay attention: all these need new name, not img
        data0 = np.asarray(img0.dataobj)
        a = np.where(data0 == 1)
        data[a] = i + 2

    new_nifti = nib.Nifti1Image(data, img.affine)
    nib.save(new_nifti, os.path.join(out_path, patient)+".nii.gz".format(out_path, patient))

 

3.  其他说明
要特别注意,当使用函数

data = img.get_fdata()

的时候,会把img和data都cache在内存里,你后面改变data或img,前面定义的变量也会改变,而且容易造成out of memory,使用

data_array = np.asarray(array_img.dataobj)

更符合平时对变量的理解

更多理解看https://nipy.org/nibabel/images_and_memory.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值