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)
更符合平时对变量的理解