You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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}")

关键修改点

  1. 动态生成保存路径:通过os.path.basename(file_path)获取原文件名,将处理后的图像以原文件名保存到新目录,避免覆盖
  2. 优化代码结构:将函数定义、模块导入移到循环外,避免重复操作,提升效率
  3. 添加文件过滤:get_filelist只收集.nii/.nii.gz文件,防止非目标文件导致报错
  4. 创建输出目录:用os.makedirs确保输出目录存在,避免保存时因目录不存在报错

内容的提问来源于stack exchange,提问作者Lena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:51:53