TorchIO:超级好用的3D医学图像处理package
TorchIO 是一个非常重要的医学影像深度学习工具包,尤其在 MRI、CT、PET 等三维医学影像数据的预处理、增强和建模中应用广泛。它基于 PyTorch 构建,因此能无缝集成到你的神经网络训练流程中。
文章目录
- 1. 基础信息介绍
- 2. TorchIO 的主要功能模块
- 2.1 图像加载与组织
- 2.2 数据预处理
- 2.3 数据增强
- 2.4 数据加载与批处理
- 2.5 Patch-based训练✨
- 3. 安装与基本使用
- 4. 数据增强使用场景
- 4.1 CT
- 4.2 MRI
- 4.3 PET
- 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表示一个完整的个体数据,可以包含多个模态影像数据和标签
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)
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 | 模拟病灶或扫描伪影 |
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 无缝衔接:
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拼回原图
sampler = tio.data.GridSampler(subject, patch_size=64)
aggregator = tio.data.GridAggregator(sampler)
→ 用于 patch-based segmentation 或 classification 模型的训练。
3. 安装与基本使用
- 安装
pip install torchio
- 测试
import torchio as tio
print(tio.__version__)
基本操作
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窗宽窗位变化 |
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 | 模拟低分辨率扫描 |
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 | 模拟小尺度器官位移 |
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)
可以使用联合空间增强,模态独立强度增强
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}),
])
