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

如何对不同尺寸3D MRI图像执行中心裁剪以保留ROI区域

3D MRI批量中心裁剪实现方案

代码失效原因

原代码运行后返回原始尺寸,核心问题有三点:

  • 核心裁剪、赋值逻辑全部被注释,循环内仅完成了图像读取、4维序列转3维的操作,没有实际执行裁剪步骤
  • 逻辑顺序错误:统计全局图像尺寸、计算裁剪基准的代码被写在单张图像的处理循环内,未完成全量文件遍历就无法确定统一裁剪参数
  • 分支逻辑不全:仅对4维格式的MRI做了降维处理,原生3维格式的MRI没有被纳入后续处理流程

3D MRI中心裁剪可行方案

针对尺寸不统一的3D MRI批量中心裁剪,按业务场景分两类处理逻辑:

  • 场景1:需要所有图像裁剪后尺寸完全一致,用于后续模型训练、批量统计
    先遍历全量文件统计所有图像的三维尺寸,取三个维度的最小值作为统一裁剪尺寸(禁止取最大值,否则尺寸小于最大值的图像无法填充出对应大小的数组),再逐张计算中心偏移量完成切片裁剪
  • 场景2:不需要统一输出尺寸,仅需保留单张图像中心固定比例的ROI
    无需提前遍历全量文件,逐张读取图像后按预设的保留比例计算单张图的裁剪范围,直接切片即可

修正代码示例

import glob
import numpy as np
import nibabel as nib

# 替换为你的MRI文件存储路径,建议明确文件后缀(如.nii、.nii.gz)避免读到无关文件
path1 = r"your_mri_file_dir/*.nii.gz"
img_list = sorted(glob.glob(path1))
all_shapes = []

# 第一轮遍历:统计所有有效3D图像的尺寸
for img_path in img_list:
    img = nib.load(img_path)
    img_data = img.get_fdata()
    # 4维序列(如带时间维度的fMRI、多模态堆叠数据)取第一个通道转3维
    if len(img_data.shape) == 4:
        img_data = img_data[:, :, :, 0]
    all_shapes.append(img_data.shape)

# 计算统一裁剪尺寸:取各维度最小值,保证所有图像都能裁出对应大小的中心区域
crop_size = np.min(np.array(all_shapes), axis=0).astype(int)
print(f"所有图像统一裁剪为尺寸:{crop_size}")

# 第二轮遍历:逐张执行中心裁剪
for img_path in img_list:
    img = nib.load(img_path)
    img_data = img.get_fdata()
    img_affine = img.affine  # 保留原始空间仿射矩阵,保存时必须用到
    # 4维数据转3维
    if len(img_data.shape) == 4:
        img_data = img_data[:, :, :, 0]
    h, w, d = img_data.shape
    ch, cw, cd = crop_size
    # 计算各维度裁剪起始坐标
    start_h = (h - ch) // 2
    start_w = (w - cw) // 2
    start_d = (d - cd) // 2
    # 数组切片直接得到裁剪结果,无需提前创建全零数组
    cropped_data = img_data[start_h:start_h+ch, start_w:start_w+cw, start_d:start_d+cd]
    
    # 按需添加保存逻辑,示例如下:
    # cropped_img = nib.Nifti1Image(cropped_data, img_affine)
    # save_path = img_path.replace(".nii.gz", "_cropped.nii.gz")
    # nib.save(cropped_img, save_path)
    print(f"文件{img_path}裁剪后尺寸:{cropped_data.shape}")

注意事项

  • 新版nibabel已经弃用get_data()方法,读取图像数组请使用get_fdata()
  • 裁剪后保存NIfTI格式文件时,必须保留原始图像的affine空间变换矩阵,否则图像的空间定位信息会丢失,后续配准、标注映射操作都会出错
  • 如果不需要统一输出尺寸,仅保留每张图中心固定比例区域(比如中心80%),可以删掉第一轮遍历统计尺寸的逻辑,在逐张处理时直接按crop_size = (np.array(img_data.shape)*0.8).astype(int)计算单张图的裁剪尺寸即可
  • 如果你的ROI不是中心对称区域,直接将代码中计算得到的起止切片坐标替换为人工标注/算法检测得到的ROI坐标即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:51:22