如何直接编辑NIfTI医学图像并删除其中的全黑无效切片?
直接处理NIfTI文件删除全黑切片的高效方案
完全不需要转PNG序列再回转,用Python的nibabel库可以直接读写NIfTI文件并完成切片过滤,单文件处理仅需几行代码,也支持批量处理大量文件。
前置依赖安装
pip install nibabel numpy
单文件处理代码示例
默认沿NIfTI的第三个维度(通常为轴向切片方向)过滤全黑切片,可根据你的数据调整轴向参数:
import nibabel as nib import numpy as np def remove_black_slices(nifti_path, output_path, axis=2, threshold=0): # 加载原始NIfTI文件 img = nib.load(nifti_path) data = img.get_fdata() affine = img.affine header = img.header # 过滤非全黑切片 # 若需兼容带低噪声的非严格全黑切片,可调整threshold为极小值,或修改判断逻辑为切片最大值<threshold valid_mask = np.any(data > threshold, axis=tuple([i for i in range(3) if i != axis])) filtered_data = data.take(np.where(valid_mask)[0], axis=axis) # 保存处理后的NIfTI文件,保留原空间信息 new_img = nib.Nifti1Image(filtered_data, affine=affine, header=header) nib.save(new_img, output_path) # 调用示例 remove_black_slices("input.nii.gz", "output.nii.gz")
批量处理代码示例
遍历指定目录下所有.nii/.nii.gz文件批量处理:
import os input_dir = "你的原始NIfTI文件目录路径" output_dir = "处理后文件保存目录路径" os.makedirs(output_dir, exist_ok=True) for filename in os.listdir(input_dir): if filename.endswith(('.nii', '.nii.gz')): input_path = os.path.join(input_dir, filename) output_path = os.path.join(output_dir, filename) remove_black_slices(input_path, output_path) print(f"已处理:{filename}")
注意事项
- 处理时默认保留了原始NIfTI的
affine矩阵和头文件信息,不会破坏图像的空间定位属性 - 可根据你的数据情况调整
axis参数适配不同的切片方向(0为矢状位、1为冠状位、2为轴向) - 若你的无效切片不是严格全零(存在极低的噪声值),可适当调高
threshold参数,或修改判断逻辑为np.max(data, axis=...) < threshold提升兼容性
内容的提问来源于stack exchange,提问作者bearbert
相关产品推荐
相关产品推荐

