当前位置: 首页 > news >正文

【monai 教程】transform之CropPad详解

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_sizeUnion[Sequence[int], int]填充后的目标空间大小。如果目标大小小于原始大小,则不改变原图大小。
methodstr填充方式,可选:‘symmetric’, ‘end’, ‘start’。
modestr填充模式,如 NumPy 的 np.pad()。可选:‘constant’, ‘edge’, ‘reflect’, ‘wrap’ 等。

填充方法对比 (method 参数)

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

示例

import monai
from monai import transformstransform = 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_borderSequence[int]每个空间维度(如 H, W, D)两侧的 padding 像素数。如果为单个 int,则两边一样。
modestrpadding 的模式,常见的有:“constant”, “reflect”, “replicate”, “circular” 等。

示例

import monai
from monai import transformstransform = 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 transformstransform = 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 transformstransform = 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 transformstransform = 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 transformstransform = 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_sizeSequence[int]如果 random_size=False,则为固定输出大小;如果 random_size=True,它是裁剪的最小尺寸
max_roi_sizeOptional[Sequence[int]]若 random_size=True,为最大随机裁剪尺寸(上界);若为 None,则默认使用图像原始尺寸为上界
random_centerbool是否随机裁剪中心点
random_sizebool是否随机裁剪尺寸。True 表示在 [roi_size, max_roi_size] 范围内随机裁剪;False 表示固定大小裁剪

示例

import monai
from monai import transformstransform = 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_scalefloat or list[float]指定裁剪区域相对于输入图像大小的比例(scale)。行为取决于 random_size 的值(见下方详解)。
max_roi_scalefloat or list[float]与 roi_scale 一起使用,仅在 random_size=True 时有效,用来限定裁剪尺寸的最大比例。
random_centerbool是否随机选择裁剪区域的中心点;若为 False,则使用图像中心。
random_sizebool是否使用随机大小进行裁剪。如果为 False,裁剪尺寸为 roi_scale * 图像尺寸;如果为 True,会在 [roi_scale, max_roi_scale] 范围内随机采样实际缩放尺寸。

示例

import monai
from monai import transformstransform = 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_sizeSequence[int]如果 random_size=False,则为固定输出大小;如果 random_size=True,它是裁剪的最小尺寸
num_samplesint从输入图像中随机生成的裁剪区域数量(patch 数)。输出是一个包含多个裁剪结果的列表。
max_roi_sizeOptional[Sequence[int]]若 random_size=True,为最大随机裁剪尺寸(上界);若为 None,则默认使用图像原始尺寸为上界
random_centerbool是否随机裁剪中心点
random_sizebool是否随机裁剪尺寸。True 表示在 [roi_size, max_roi_size] 范围内随机裁剪;False 表示固定大小裁剪

示例

import monai
from monai import transformstransform = 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 用于根据指定的前景区域裁剪图像及其对应的标签等数据。其本质是在空间维度上将图像缩小到仅包含前景的区域

使用场景

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

参数解析

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

示例

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

使用场景

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

参数解析

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

示例

import monai
from monai import transformstransform = 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 是将图像和标签(如掩码)调整到目标大小,可以通过“裁剪”或“填充”的方式来实现。

使用场景

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

参数解析

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

示例

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

在这里插入图片描述

http://www.xdnf.cn/news/537535.html

相关文章:

  • 磁流体 磁性流体 磁液
  • 封装一个基于 WangEditor 的富文本编辑器组件(Vue 3 + TypeScript 实战)
  • UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview---33.2.6 Strings
  • Oracle 中 open_cursors 参数详解:原理、配置与性能测试
  • 一键无损批量压缩图片 保留高清细节 开源免费!支持 10 + 格式转换
  • HashMap 的特点及应用场景
  • GraphQL 接口设计
  • SRS流媒体服务器(6)源码分析之推流篇
  • 2025.05.19【Barplot】柱状图的多样性绘制
  • Linux句柄数过多问题排查
  • stm32如何触摸屏设置显示按钮
  • c#将json字符串转换为对象数组
  • Linux-进程信号
  • Python 与 Java 在 Web 开发中的深度对比:从语言特性到生态选型
  • GPU状态监控
  • MPCount: 人群计数的单域泛化
  • 【成品设计】基于 STM32 的智能鞋柜系统
  • TransmittableThreadLocal实现上下文传递-笔记
  • 「HHT(希尔伯特黄变换)——ECG信号处理-第十三课」2025年5月19日
  • 院校机试刷题第七天:1828西交-矩阵相加、1822计算圆周率、1823学生成绩排序
  • 基于PetaLinux的Zynq PS应用自启动全攻略
  • 开发指南116-font-size: 0的使用
  • 深入解析 Oracle session_cached_cursors 参数及性能对比实验
  • python动漫论坛管理系统
  • ubuntu open shh9.9安装
  • W3电力线载波通信技术
  • 物流项目第一期(登录业务)
  • 40亿非负整数中找到出现两次的数和所有数的中位数
  • 技术决策缺乏团队参与,如何增强执行力?
  • 修改样式还能影响功能?是的!