TorchIO:超级好用的3D医学图像处理package

TorchIO 是一个非常重要的医学影像深度学习工具包,尤其在 MRI、CT、PET 等三维医学影像数据的预处理、增强和建模 中应用广泛。它基于 PyTorch 构建,因此能无缝集成到你的神经网络训练流程中。

文章目录

    • [1. 基础信息介绍](#1. 基础信息介绍)
    • [2. TorchIO 的主要功能模块](#2. TorchIO 的主要功能模块)
      • [2.1 图像加载与组织](#2.1 图像加载与组织)
      • [2.2 数据预处理](#2.2 数据预处理)
      • [2.3 数据增强](#2.3 数据增强)
      • [2.4 数据加载与批处理](#2.4 数据加载与批处理)
      • [2.5 Patch-based训练✨](#2.5 Patch-based训练✨)
    • [3. 安装与基本使用](#3. 安装与基本使用)
    • [4. 数据增强使用场景](#4. 数据增强使用场景)
      • [4.1 CT](#4.1 CT)
      • [4.2 MRI](#4.2 MRI)
      • [4.3 PET](#4.3 PET)
      • [4.4 多模态策略(PET/CT或PET/MRI)](#4.4 多模态策略(PET/CT或PET/MRI))

1. 基础信息介绍

TorchIO 是一个开源的 Python 库,专为 三维医学影像(3D medical imaging) 的预处理、数据增强(augmentation)和深度学习工作流程而设计。TorchIO 的设计理念是:

复制代码
"让医学影像能像普通图像那样轻松被 PyTorch 使用。"

项目主页

👉 https://torchio.readthedocs.io

👉 GitHub: https://github.com/fepegar/torchio

2. TorchIO 的主要功能模块

2.1 图像加载与组织

  • 支持格式:NIFTI(.nii/.nii.gz格式),DICOM,Numpy等
  • 核心结构:
    torchio.Image表示单个影像通道(例如一张T1 MRI或PET)
    torchio.Subject表示一个完整的个体数据,可以包含多个模态影像数据和标签
python 复制代码
import torchio as tio
subject = tio.Subject(
    t1=tio.ScalarImage('subj1_T1.nii.gz'),
    pet=tio.ScalarImage('subj1_PET.nii.gz'),
    label=tio.LabelMap('subj1_label.nii.gz')
)

2.2 数据预处理

TorchIO 支持一系列常见的医学影像预处理操作:

  • 重采样(Resample):统一体素大小
  • 归一化(ZNormalization, RescaleIntensity)
  • 裁剪或填充(CropOrPad, Pad, Crop)
  • 仿射对齐(Affine)
python 复制代码
transform = tio.Compose([
    tio.Resample((1, 1, 1)),  # 重采样为1mm³体素
    tio.ZNormalization(),     # z-score标准化
    tio.CropOrPad((128, 128, 128))  # 统一尺寸
])
processed = transform(subject)

2.3 数据增强

TorchIO 支持各种空间变换与强度变换:

类型 示例 说明
空间变换 RandomAffine,RandomElasticDeformation,RandomFlip 随机旋转、弹性形变、翻转
强度变换 RandomNoise, RandomBlur, RandomGamma, RandomBiasField 模拟噪声、对比度变化
病灶模拟 RandomSwap, RandomMotion, RandomSpike, RandomBiasField 模拟病灶或扫描伪影
python 复制代码
augmentation = tio.Compose([
    tio.RandomFlip(axes=(0,)),           # 左右翻转
    tio.RandomAffine(scales=(0.9, 1.1)), # 随机缩放
    tio.RandomNoise(std=0.01),           # 加噪声
])
augmented = augmentation(subject)

2.4 数据加载与批处理

TorchIO 能与 PyTorch 的 DataLoader 无缝衔接:

python 复制代码
subjects = [subject1, subject2, subject3]
dataset = tio.SubjectsDataset(subjects, transform=augmentation)
loader = torch.utils.data.DataLoader(dataset, batch_size=2, shuffle=True)

2.5 Patch-based训练✨

医学影像通常非常大(512×512×512体素),直接输入模型显存会爆。TorchIO 提供 patch-based sampling 工具:

  • tio.data.GridSampler: 自动将3D图像分块
  • tio.data.GridAggregator: 把模型输出的patch拼回原图
python 复制代码
sampler = tio.data.GridSampler(subject, patch_size=64)
aggregator = tio.data.GridAggregator(sampler)

→ 用于 patch-based segmentation 或 classification 模型的训练。

3. 安装与基本使用

  • 安装
bash 复制代码
pip install torchio
  • 测试
python 复制代码
import torchio as tio
print(tio.__version__)

基本操作

python 复制代码
t1 = tio.ScalarImage('t1.nii.gz')
pet = tio.ScalarImage('pet.nii.gz')
subject = tio.Subject(t1=t1, pet=pet)

4. 数据增强使用场景

模态 成像机制 增强重点 不宜操作
CT 组织密度 → 灰度线性关系明显 空间变换 + 轻度噪声/伽马调整 不能大幅更改强度范围(HU值)
MRI T1/T2等加权,强度非线性 空间形变 + 偏置场 + 对比度变化 不能直接线性归一化到0--1
PET(如PSMA PET/CT) 放射性浓度定量(SUV) 保留SUV相对比例 + 噪声增强 禁止大幅伽马或bias变换

4.1 CT

增强类型 TorchIO 方法 说明
空间翻转 RandomFlip 模拟左右或前后位置差异
仿射变换 RandomAffine 轻度旋转与缩放
弹性形变 RandomElasticDeformation 模拟组织弹性差异
噪声增强 RandomNoise 模拟扫描噪声
对比度增强 RandomGamma 模拟CT窗宽窗位变化
python 复制代码
ct_transform = tio.Compose([
    tio.RandomFlip(axes=(0, 1)),
    tio.RandomAffine(scales=(0.9, 1.1), degrees=5),
    tio.RandomElasticDeformation(max_displacement=4),
    tio.RandomNoise(std=0.01),
    tio.RandomGamma(log_gamma=(-0.3, 0.3)),
])

4.2 MRI

增强类型 TorchIO 方法 说明
空间翻转 RandomFlip 模拟扫描体位差
仿射变换 RandomAffine 模拟姿势变化
弹性形变 RandomElasticDeformation 模拟软组织弹性差
偏置场 RandomBiasField 模拟MRI强度不均
对比度变化 RandomGamma 模拟T1/T2扫描差异
噪声 RandomNoise 模拟设备噪声
运动伪影 RandomMotion 模拟扫描中头动/体动
模糊伪影 RandomBlur 模拟低分辨率扫描
python 复制代码
mri_transform = tio.Compose([
    tio.RandomFlip(axes=(0, 1)),
    tio.RandomAffine(scales=(0.9, 1.1), degrees=10),
    tio.RandomElasticDeformation(max_displacement=5),
    tio.RandomBiasField(coefficients=0.3),
    tio.RandomGamma(log_gamma=(-0.4, 0.4)),
    tio.RandomNoise(std=0.02),
    tio.RandomMotion(degrees=5, translation=3),
    tio.RandomBlur(std=(0, 1)),
])

4.3 PET

增强类型 TorchIO 方法 说明
空间翻转 RandomFlip 模拟扫描方向变化
仿射变换 RandomAffine 模拟轻微配准误差
噪声 RandomNoise 模拟低统计计数噪声
模糊 RandomBlur 模拟分辨率差
强度缩放 RescaleIntensity 归一化SUV值
对比度轻度调整 RandomGamma 小幅增强对比
弹性形变 RandomElasticDeformation 模拟小尺度器官位移
python 复制代码
pet_transform = tio.Compose([
    tio.RescaleIntensity(out_min_max=(0, 1)),
    tio.RandomFlip(axes=(0, 1)),
    tio.RandomAffine(scales=(0.95, 1.05), degrees=5),
    tio.RandomElasticDeformation(max_displacement=2),
    tio.RandomNoise(std=0.03),
    tio.RandomBlur(std=(0, 1)),
    tio.RandomGamma(log_gamma=(-0.2, 0.2)),
])

💡 PET增强注意事项:

  • 不能使用 RandomBiasField(会破坏SUV定量)
  • 不建议使用强烈的 RandomGamma 或大范围 Affine
  • 若模型以SUV特征为输入,应保持线性关系(建议仅用噪声、模糊类)

4.4 多模态策略(PET/CT或PET/MRI)

可以使用联合空间增强,模态独立强度增强

python 复制代码
shared_spatial = tio.Compose([
    tio.RandomFlip(axes=(0, 1)),
    tio.RandomAffine(scales=(0.95, 1.05), degrees=5),
    tio.RandomElasticDeformation(max_displacement=3),
])
pet_only = tio.Compose([
    tio.RandomNoise(std=0.03),
    tio.RandomBlur(std=(0, 1)),
])
mri_only = tio.Compose([
    tio.RandomBiasField(coefficients=0.3),
    tio.RandomGamma(log_gamma=(-0.4, 0.4)),
])
ct_only = tio.Compose([
    tio.RandomGamma(log_gamma=(-0.3, 0.3)),
    tio.RandomNoise(std=0.01),
])

subject_transform = tio.Compose([
    shared_spatial,
    tio.OneOf({pet_only: 0.4, mri_only: 0.4, ct_only: 0.2}),
])
相关推荐
王哈哈^_^13 小时前
YOLO11实例分割训练任务——从构建数据集到训练的完整教程
人工智能·深度学习·算法·yolo·目标检测·机器学习·计算机视觉
SalvoGao13 小时前
Python学习 | 怎么理解epoch?
数据结构·人工智能·python·深度学习·学习
studytosky15 小时前
深度学习理论与实战:Pytorch基础入门
人工智能·pytorch·python·深度学习·机器学习
w***Q35016 小时前
深度学习博客
人工智能·深度学习
laplace012321 小时前
AI算法(深度学习)
深度学习
我闻 如是1 天前
OSError: [WinError 182] 操作系统无法运行 %1。
人工智能·深度学习
【建模先锋】1 天前
精品数据分享 | 锂电池数据集(二)Nature子刊论文公开锂离子电池数据
深度学习·锂电池剩余寿命预测·锂电池数据集·剩余寿命预测模型
王哈哈^_^1 天前
【完整源码+数据集】中药材数据集,yolov8中药分类检测数据集 9709 张,中药材分类识别数据集,中药材识别系统实战教程
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·毕业设计
老鱼说AI1 天前
PyTorch 深度强化学习实战:从零手写 PPO 算法训练你的月球着陆器智能体
人工智能·pytorch·深度学习·机器学习·计算机视觉·分类·回归
brave and determined1 天前
可编程逻辑器件学习(day26):低主频FPGA为何能碾压高主频CPU?
人工智能·嵌入式硬件·深度学习·学习·fpga开发·云计算·fpga