如何对不同尺寸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
相关产品推荐
相关产品推荐

