如何用Python-nibabel批量翻转.nii fMRI图像?代码仅生成单结果求解
批量翻转fMRI .nii图像问题解决
问题描述
我有180张.nii格式的fMRI图像,需要批量将它们从右向左翻转。尝试用for循环批量处理,但代码仅生成一个结果,附上代码如下:
原代码
import nibabel as nib import numpy as np import os NII_DIR='/Users/lena/testtest' def get_filelist(dir, Filelist): if os.path.isdir(dir): for s in os.listdir(dir): newDir = os.path.join(dir, s) Filelist.append(newDir) return Filelist list = get_filelist(NII_DIR, []) print(len(list)) type(list) for i in list: def read_nii_file1(nii_path): nii_img=nib.load(nii_path) return nii_img nii_img=read_nii_file1(os.path.join(i)) from nilearn.image import new_img_like print(nii_img.affine.shape) print(nii_img.affine) def flip_image(image, axis): try: new_data = np.copy(image.get_fdata()) for axis_index in axis: new_data = np.flip(new_data, axis=axis_index) except TypeError: new_data = np.flip(image.get_fdata(), axis=axis) return new_img_like(image, data=new_data) new_image = flip_image(nii_img, axis=[0]) affine = new_image.affine.copy() hdr = new_image.header.copy() new_data = new_image.get_fdata() new_nii = nib.Nifti1Image(new_data, affine, hdr) #the following is the part I have no idea how to write New_NII_DIR = ('/Users/lena/test_new/001.nii') nib.save(new_nii, New_NII_DIR)
问题分析
代码只生成一个结果的核心原因是保存路径固定为同一个文件:每次循环都把处理后的图像保存到/Users/lena/test_new/001.nii,后续处理的图像会覆盖之前的结果,最终只保留最后一张处理后的图像。
此外代码存在冗余问题:
- 函数
read_nii_file1、flip_image定义在for循环内部,每次循环重复定义,完全没必要 from nilearn.image import new_img_like放在循环内,重复导入模块get_filelist函数没有过滤文件类型,如果目录下有非.nii文件会报错
修正后的代码
import nibabel as nib import numpy as np import os from nilearn.image import new_img_like NII_DIR = '/Users/lena/testtest' NEW_NII_DIR = '/Users/lena/test_new' # 创建输出目录(如果不存在) os.makedirs(NEW_NII_DIR, exist_ok=True) def get_filelist(dir_path): file_list = [] if os.path.isdir(dir_path): for filename in os.listdir(dir_path): # 只保留.nii或.nii.gz文件 if filename.endswith(('.nii', '.nii.gz')): file_path = os.path.join(dir_path, filename) file_list.append(file_path) return file_list def read_nii_file(nii_path): return nib.load(nii_path) def flip_image(image, axis): try: new_data = np.copy(image.get_fdata()) for axis_index in axis: new_data = np.flip(new_data, axis=axis_index) except TypeError: new_data = np.flip(image.get_fdata(), axis=axis) return new_img_like(image, data=new_data) # 获取所有nii文件路径 nii_files = get_filelist(NII_DIR) print(f"共找到{len(nii_files)}个nii文件") for file_path in nii_files: # 读取图像 nii_img = read_nii_file(file_path) # 沿轴0翻转(对应右向左翻转) new_image = flip_image(nii_img, axis=[0]) # 构造保存路径:保留原文件名,存到新目录 filename = os.path.basename(file_path) save_path = os.path.join(NEW_NII_DIR, filename) # 保存处理后的图像 nib.save(new_image, save_path) print(f"已保存: {save_path}")
关键修改点
- 动态生成保存路径:通过
os.path.basename(file_path)获取原文件名,将处理后的图像以原文件名保存到新目录,避免覆盖 - 优化代码结构:将函数定义、模块导入移到循环外,避免重复操作,提升效率
- 添加文件过滤:
get_filelist只收集.nii/.nii.gz文件,防止非目标文件导致报错 - 创建输出目录:用
os.makedirs确保输出目录存在,避免保存时因目录不存在报错
内容的提问来源于stack exchange,提问作者Lena
相关产品推荐
相关产品推荐

