【monai 教程】transform之CropPad详解

发布于:2025-05-20 ⋅ 阅读:(16) ⋅ 点赞:(0)

monai transform教程之CropPad详解

本教程代码: https://github.com/codecat0/Deep-Learning-With-Code/blob/master/tutotial/monai/monai_aug_croppad.ipynb

SpatialPad

SpatialPad 是 MONAI(Medical Open Network for AI)中用于医学图像预处理的数据增强工具之一,主要用于将图像或标签填充到指定的空间大小,常用于训练时保证图像输入的一致性,尤其是批处理操作时。

使用场景

  • 图像尺寸不一致时,对齐输入尺寸。

  • 模型需要固定大小输入时,自动填充图像边界。

  • 适用于 2D/3D 医学图像(如 CT/MRI)。

参数解析

参数 类型 含义
spatial_size Union[Sequence[int], int] 填充后的目标空间大小。如果目标大小小于原始大小,则不改变原图大小。
method str 填充方式,可选:‘symmetric’, ‘end’, ‘start’。
mode str 填充模式,如 NumPy 的 np.pad()。可选:‘constant’, ‘edge’, ‘reflect’, ‘wrap’ 等。

填充方法对比 (method 参数)

方法名 描述
‘symmetric’ 前后填充相同量,中心对齐
‘end’ 只在后面填充

示例

import monai
from monai import transforms

transform = transforms.SpatialPadd(keys=["image", "label"], spatial_size=[768, 768, 38])

aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述

BorderPad

BorderPad 是一种用于医学图像处理的数据预处理/增强操作。它的主要作用是:通过在图像边缘添加一定数量的像素(padding),以满足特定尺寸需求或防止某些操作(如卷积或裁剪)引入边界伪影。

使用场景

  • 模型输入对齐 :某些模型需要特定的输入大小,BorderPad 可以先 pad 再 crop。

  • 防止边缘伪影 :对小图像进行卷积、旋转、缩放等操作时可能导致边缘信息缺失,用 BorderPad 增加边界空间。

  • 适用于 2D/3D 医学图像(如 CT/MRI)。

参数解析

参数名 类型 说明
spatial_border Sequence[int] 每个空间维度(如 H, W, D)两侧的 padding 像素数。如果为单个 int,则两边一样。
mode str padding 的模式,常见的有:“constant”, “reflect”, “replicate”, “circular” 等。

示例

import monai
from monai import transforms

transform = transforms.BorderPadd(keys=["image", "label"], spatial_border=[32, 32, 0])
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述

DivisiblePad

DivisiblePadd 是一种常用的图像预处理/增强操作,主要用于将图像在各个维度上填充到指定的倍数大小。这对于深度学习模型(特别是使用 U-Net 等结构)非常重要,因为很多模型要求输入尺寸能够被某个数整除(如 16 或 32)。

使用场景

  • 输入尺寸不规则但模型要求特定倍数的尺寸

  • 对于 Patch-based 推理(如 sliding window)特别重要

  • 避免在网络中因尺寸不匹配造成的 shape mismatch 错误

参数解析

  • k :要求图像的每个空间维度(如 H、W、D)要填充到的倍数。例如,k=32 表示图像尺寸会被填充到能被 32 整除。

  • mode :填充方式(传递给 np.padtorch.nn.functional.pad),常见的有:

    • "constant":使用常数填充(通常是 0)

    • "reflect":镜像填充

    • "replicate":边缘复制

  • method :如何计算填充值的位置:

    • "symmetric":左右/上下对称填充

    • "end":仅在图像的结尾方向填充

  • value :常数填充值,仅在 mode 为 “constant” 时有效。

示例

import monai
from monai import transforms

transform = transforms.DivisiblePadd(keys=["image", "label"], k=32)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data, ori_idx=19, aug_idx=32)

在这里插入图片描述

SpatialCrop

SpatialCropd 用于从输入图像中按指定的空间维度和起始位置裁剪一个区域。

使用场景

  • 提取感兴趣区域(ROI)以减小计算负担

参数解析

  • roi_start:裁剪区域的起始坐标。

  • roi_end:裁剪区域的结束坐标(可选)。

  • roi_center:裁剪区域的中心点(可选)。

  • roi_size:裁剪区域的大小(可选)。

⚠️ roi_start + roi_sizeroi_e 是互斥使用的,不能同时指定。

示例

import monai
from monai import transforms

transform = transforms.SpatialCropd(
    keys=["image", "label"],
    roi_center=[256, 256, 19],
    roi_size=[384, 384, 38]
)

transform = transforms.SpatialCropd(
    keys=["image", "label"],
    roi_start=[32, 32, 0],
    roi_end=[484, 484, 38]
)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述

CenterSpatialCrop

CenterSpatialCropd 会以图像的中心为参考点,在空间维度上(通常是 2D 或 3D)裁剪出一个指定大小的区域。这对于医学图像中感兴趣区域往往位于中心的情况尤其有用。

使用场景

  • 用于统一图像大小(尤其在数据集中图像大小不一致时)
  • 用于提取中心区域的局部信息(医学图像中通常包含器官或病灶)

参数解析

  • roi_size: list[int] or tuple

    • 指定裁剪区域的空间大小。例如 [128, 128, 64] 表示裁剪出一个大小为 128×128×64 的三维子区域。

    • 注意:这个尺寸必须小于或等于原始图像的大小,否则不会进行裁剪。

示例

import monai
from monai import transforms

transform = transforms.CenterSpatialCropd(
    keys=["image", "label"],
    roi_size=[384, 384, 38]
)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述

CenterScaleCrop

CenterScaleCropd 结合了图像中心缩放(CenterScale)和裁剪(Crop)操作,常用于保持关键区域(如器官或病灶)居中,同时调整图像尺寸。该变换用于将图像按照给定的 roi_scale 围绕图像中心进行。

使用场景

  • CT/MRI 图像预处理,特别是关心中心区域的任务(如脑、肺、肝分割)

参数解析

  • roi_scale: 缩放系数。例如 0.75 表示在中心附近保留 8 128, 64)`。

示例

import monai
from monai import transforms

transform = transforms.CenterScaleCropd(
    keys=["image", "label"],
    roi_scale=[0.6, 0.6, 1],
)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述

RandSpatialCrop

RandSpatialCropd 的作用是从输入图像中随机裁剪出一个指定大小/某一范围内(ROI size,Region of Interest)的子区域(patch)。

使用场景

  • 图像裁剪

参数解析

参数名 类型 说明
roi_size Sequence[int] 如果 random_size=False,则为固定输出大小;如果 random_size=True,它是裁剪的最小尺寸
max_roi_size Optional[Sequence[int]] 若 random_size=True,为最大随机裁剪尺寸(上界);若为 None,则默认使用图像原始尺寸为上界
random_center bool 是否随机裁剪中心点
random_size bool 是否随机裁剪尺寸。True 表示在 [roi_size, max_roi_size] 范围内随机裁剪;False 表示固定大小裁剪

示例

import monai
from monai import transforms

transform = transforms.RandSpatialCropd(
    keys=["image", "label"],
    roi_size=[224, 224, 38],
    max_roi_size=[512, 512, 38],
    random_center=True,
    random_size=True
)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述

RandScaleCrop

RandSpatialCropd 的作用是从输入图像中随机缩放出一个指定scale/某一范围内(ROI size,Region of Interest)的子区域(patch)。

使用场景

  • 用于训练阶段,增强样本多样性
  • 减少模型对图像固定尺寸和位置的依赖
  • 在有限数据集上提升模型泛化能力

参数解析

参数 类型 说明
roi_scale float or list[float] 指定裁剪区域相对于输入图像大小的比例(scale)。行为取决于 random_size 的值(见下方详解)。
max_roi_scale float or list[float] 与 roi_scale 一起使用,仅在 random_size=True 时有效,用来限定裁剪尺寸的最大比例。
random_center bool 是否随机选择裁剪区域的中心点;若为 False,则使用图像中心。
random_size bool 是否使用随机大小进行裁剪。如果为 False,裁剪尺寸为 roi_scale * 图像尺寸;如果为 True,会在 [roi_scale, max_roi_scale] 范围内随机采样实际缩放尺寸。

示例

import monai
from monai import transforms

transform = transforms.RandScaleCropd(
    keys=["image", "label"],
    roi_scale=[0.3, 0.3, 1],
    max_roi_scale=[1, 1, 1],
    random_center=True,
    random_size=True
)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述

RandSpatialCropSamples

RandSpatialCropSamplesd 会从输入图像中随机裁剪出多个子区域(patches),通常用于训练数据增强。这些裁剪是沿空间维度进行的,比如在 3D 图像中沿着 (H, W, D)。

使用场景

  • 适合与 DatasetCacheDataset 一起使用。
  • 多个 patch 输出适用于多个实例训练(如将多个 patch 扔入 batch)。

参数解析

参数名 类型 说明
roi_size Sequence[int] 如果 random_size=False,则为固定输出大小;如果 random_size=True,它是裁剪的最小尺寸
num_samples int 从输入图像中随机生成的裁剪区域数量(patch 数)。输出是一个包含多个裁剪结果的列表。
max_roi_size Optional[Sequence[int]] 若 random_size=True,为最大随机裁剪尺寸(上界);若为 None,则默认使用图像原始尺寸为上界
random_center bool 是否随机裁剪中心点
random_size bool 是否随机裁剪尺寸。True 表示在 [roi_size, max_roi_size] 范围内随机裁剪;False 表示固定大小裁剪

示例

import monai
from monai import transforms

transform = transforms.RandSpatialCropSamplesd(
    keys=["image", "label"],
    roi_size=[224, 224, 38],
    max_roi_size=[512, 512, 38],
    num_samples=4,
    random_size=True
)
aug_datas = transform(add_data)
len(aug_datas)    # 4
print_info(aug_datas[0])
visualize(data, aug_datas[0])

在这里插入图片描述

CropForeground

CropForegroundd 用于根据指定的前景区域裁剪图像及其对应的标签等数据。其本质是在空间维度上将图像缩小到仅包含前景的区域

使用场景

  • 病灶区域占比较小,用全图训练模型会浪费资源且影响模型专注目标区域

参数解析

参数名 类型 默认值 说明
keys list[str] 必填 要执行裁剪的字段名列表,如 [“image”, “label”]。
source_key str 用于识别前景区域的字段,一般为标签,如 “label”。
select_fn callable lambda x: x > 0 前景选择函数,定义哪些像素为前景。
channel_indices list[int] / None None 仅在指定通道中寻找前景区域,默认所有通道。
margin int or list[int] 0 在裁剪框周围添加的边缘像素数量,可为单个值或每个维度一个列表。
allow_smaller bool False 图像边界不足时是否允许裁剪框小于设定范围。False 可能导致 padding。
k_divisible int or tuple 1 控制裁剪结果的每个空间维度是否为该值的倍数,用于满足网络结构要求。
mode str or list[str] “constant” 填充模式,裁剪区域超出图像边界时使用。支持 numpy 和 PyTorch 的 pad 模式。
start_coord_key str or None None 如果设置,则记录裁剪区域的起始坐标,保存在数据中。
end_coord_key str or None None 如果设置,则记录裁剪区域的结束坐标,保存在数据中。

示例

import monai
from monai import transforms

transform = transforms.CropForegroundd(
    keys=["image", "label"],
    source_key="label"
)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data, ori_idx=20, aug_idx=6)

在这里插入图片描述

RandCropByPosNegLabel

RandCropByPosNegLabeld是一个常用的随机裁剪数据增强变换,特别适用于医学图像分割任务中,对图像和对应标签(mask)进行裁剪。这个变换基于“正负样本”策略,保证裁剪出的子图像包含感兴趣区域(正样本)和背景(负样本),从而提高模型对目标和背景的区分能力。

使用场景

  • 医学图像分割训练中,数据增强,增强模型对小目标和背景的识别能力。

参数解析

参数名 含义与说明
keys 需要进行裁剪的数据字段名列表。通常是[“image”, “label”],指明对哪些数据字段执行裁剪。
label_key 标签数据对应的字段名,用来判断哪些位置是前景(感兴趣区域)、哪些是背景,作为裁剪时选择中心点的依据。
spatial_size 裁剪patch的空间大小,如[224,224,128]。若某维度指定尺寸大于该维度图像大小,则该维度不会被裁剪,保持原始大小。若某维度为非正值(<=0),则使用标签对应维度大小。示例:输入尺寸为[40,40,40],spatial_size=[32,64,-1],输出裁剪尺寸为[32,40,40]。
pos 与neg一起决定裁剪中心选择为前景(有标签区域)的概率。比例是pos/(pos+neg)。
neg 与pos一起决定裁剪中心选择为背景的概率。比例是neg/(pos+neg)。
num_samples 每个样本中裁剪patch的数量,即返回几个裁剪区域。
image_key 如果指定,负样本中心点选择时会限制在标签为背景且图像值大于image_threshold的位置,确保负样本裁剪在有效图像区域内。
image_threshold 用于判断图像有效区域的阈值,配合image_key使用。裁剪负样本时只选择大于该阈值的像素点作为中心。
fg_indices_key 预先计算好的前景索引,替代image_key和image_threshold判断,索引应是一维空间位置数组。常结合FgBgToIndicesd变换使用。
bg_indices_key 预先计算好的背景索引,同上。
allow_smaller 如果为False,当图像尺寸小于裁剪尺寸时会抛出异常;为True时,较小维度会不裁剪直接返回原尺寸。

示例

import monai
from monai import transforms

transform = transforms.RandCropByPosNegLabeld(
    keys=["image", "label"],
    label_key="label",
    spatial_size=[448, 448, 38],
    pos=5,
    neg=1,
    num_samples=2,
    image_key="image",
    image_threshold=0
)
aug_datas = transform(add_data)
len(aug_datas)   # 2
print_info(aug_datas[0])
visualize(data, aug_datas[0])

在这里插入图片描述

RandCropByLabelClasses

RandCropByLabelClassesd 主要用于根据标签图中的类(class)随机裁剪图像,使模型能够更好地学习不同类别的区域,尤其是处理类别不均衡问题时非常有用。根据标签图中的不同类别,随机裁剪图像区域,并确保裁剪区域包含特定的类别像素。这样可以使模型更关注感兴趣区域(如肿瘤、小器官等),而不是大片背景。

使用场景

  • 医学图像分割中,小器官或病灶区域容易被忽略,通过这种裁剪方式让模型更关注难学区域
  • 类别不平衡严重的数据集,提高训练效果

参数解析

参数名 类型 说明
keys list[str] 要应用裁剪的键名列表,如 [“image”, “label”]。
label_key str 标签的键名,用于查找每个类别的位置索引。
spatial_size list[int] 裁剪的空间大小,例如 [96, 96, 96]。支持负数(表示保持原尺寸)。
ratios list[float] / None 每个类别用于生成裁剪中心的采样比率(包含背景类)。为 None 时类别等概率采样。
num_classes int / None 类别数,用于非 one-hot 标签。如果是 one-hot 编码,则不需要设置。
num_samples int 每次返回的裁剪块数量。
image_key str / None (可选)用于筛选图像中有效区域的键名,仅采样 image > image_threshold 的区域。
image_threshold float (搭配 image_key)阈值,图像中大于该值的区域才会用于采样。
indices_key str / None (可选)预先计算好的类别索引键名,可加速采样,常搭配 ClassesToIndices 使用。
allow_smaller bool 如果为 True,图像尺寸小于 spatial_size 时也允许执行,小维度保持不变。

示例

import monai
from monai import transforms

transform = transforms.RandCropByLabelClassesd(
    keys=["image", "label"],
    label_key="label",
    spatial_size=(448, 448, -1),
    ratios=(0.2, 0, 0.2, 0.2, 0, 0),
    num_classes=6,
    num_samples=2
)
aug_datas = transform(add_data)
len(aug_datas)   # 2
print_info(aug_datas[0])
visualize(data, aug_datas[0])

在这里插入图片描述

ResizeWithPadOrCrop

ResizeWithPadOrCropd 是将图像和标签(如掩码)调整到目标大小,可以通过“裁剪”或“填充”的方式来实现。

使用场景

  • 模型输入必须是固定大小的情况

参数解析

参数名 类型 默认值 说明
keys List[str] 要应用变换的数据键,例如 [“image”, “label”]。
spatial_size Union[Sequence[int], int] 输出的空间大小(如 (128, 128, 64));如果某维为非正数(如 0、-1),则保留原始尺寸。
mode Union[str, Sequence[str]] “constant” 填充模式。NumPy 支持 “constant”, “edge”, “reflect”, 等;Torch 支持 “constant”, “reflect”, “replicate”, “circular” 等。
allow_missing_keys bool False 是否允许某些 key 缺失而不报错。设为 True 可跳过缺失的 key。
method str (“symmetric” / “end”) “symmetric” 填充方法:“symmetric” 为两边均匀填充,“end” 仅在尾部填充。
pad_kwargs dict {} 传递给 np.pad 或 torch.nn.functional.pad 的额外参数,例如 {“constant_values”: 0} 表示常数填充值为 0。

示例

import monai
from monai import transforms

transform = transforms.ResizeWithPadOrCropd(
    keys=["image", "label"],
    spatial_size=[448, 448, 38]
)
aug_data = transform(add_data)
print_info(aug_data)
visualize(data, aug_data)

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到