torchvision.transforms 的CenterCrop():在图片的中间区域进行裁剪

PyTorch图像预处理
本文详细介绍PyTorch中torchvision.transforms模块的功能,包括Resize、Normalize、ToTensor等常用图像预处理函数,以及如何使用Compose整合多个处理步骤。

pytorch中transform函数

 

torchvision.transforms是pytorch中的图像预处理包

一般用Compose把多个步骤整合到一起:

比如说

transforms.Compose([

transforms.CenterCrop(10),

transforms.ToTensor(),

])

这样就把两个步骤整合到一起

接下来介绍transforms中的函数

Resize:把给定的图片resize到given size

Normalize:Normalized an tensor image with mean and standard deviation

ToTensor:convert a PIL image to tensor (H*W*C) in range [0,255] to a torch.Tensor(C*H*W) in the range [0.0,1.0]

ToPILImage: convert a tensor to PIL image

Scale:目前已经不用了,推荐用Resize

CenterCrop:在图片的中间区域进行裁剪

RandomCrop:在一个随机的位置进行裁剪

RandomHorizontalFlip:以0.5的概率水平翻转给定的PIL图像

RandomVerticalFlip:以0.5的概率竖直翻转给定的PIL图像

RandomResizedCrop:将PIL图像裁剪成任意大小和纵横比

Grayscale:将图像转换为灰度图像

RandomGrayscale:将图像以一定的概率转换为灰度图像

FiceCrop:把图像裁剪为四个角和一个中心

TenCrop

Pad:填充

ColorJitter:随机改变图像的亮度对比度和饱和度

<think>我们正在讨论的是torchvision.transforms.CenterCrop,而不是之前的Resize。根据用户的要求,我们需要提供CenterCrop的函数原型和用法。 根据引用[1]中提到的RandomCrop的格式,我们可以推断CenterCrop的函数原型应该也是类似的,但CenterCrop不需要padding等参数,因为它只是从中心裁剪。 另外,引用[2]和引用[3]中提到了CenterCrop的使用,我们可以参考这些引用来构建答案。 函数原型(根据官方文档): class torchvision.transforms.CenterCrop(size) 参数说明: size (sequence or int): 期望的输出尺寸。如果size是整数,则裁剪为正方形;如果size是类似(h, w)的序列,则裁剪为高度h和宽度w。 功能:将给定的图像在中心裁剪为指定的尺寸。如果图像尺寸小于输出尺寸,则会先进行填充(在torchvision的较新版本中,如果尺寸不足,默认会填充0,但CenterCrop本身没有填充参数,因此对于尺寸不足的情况,它会先填充再裁剪?实际上,在旧版本中,如果尺寸不足,会先进行填充,但CenterCrop本身不提供填充参数。在较新的版本中,CenterCrop对于尺寸不足的情况,会使用padding?不,我们查看官方文档:CenterCrop如果图像尺寸小于给定的输出尺寸,则会在裁剪前用0填充(即自动填充)。但注意,这个填充行为是内置的,不需要用户设置。 但是,根据官方文档(我们这里没有直接引用,但根据经验),CenterCrop的处理逻辑是: 1. 如果输入图像尺寸大于等于目标尺寸,则直接从中心裁剪出目标尺寸。 2. 如果输入图像尺寸小于目标尺寸(在某个维度上),则先在该维度上对称填充至目标尺寸(即填充到至少目标尺寸),然后再进行中心裁剪(实际上填充后裁剪出来的就是填充后的图像中心,因为填充后尺寸刚好等于目标尺寸,那么整个图像就是裁剪区域)。 注意:在旧版本的torchvision中,CenterCrop对于小于目标尺寸的图像不会填充,而是直接放大图像?实际上不是,CenterCrop不会改变图像的比例,它要求图像至少是目标尺寸,否则会报错?但根据最新文档(1.10+),CenterCrop已经支持了自动填充,即当图像小于目标尺寸时,会自动用0填充边缘,然后再进行中心裁剪。 因此,我们这样描述: 参数: size (int 或 sequence): 如果是int,则裁剪为(size, size)的正方形;如果是sequence,则裁剪为(size[0], size[1])的矩形。 注意:如果输入图像尺寸小于目标尺寸,则会在裁剪前用0填充(即自动填充),确保能够裁剪出目标尺寸。 另外,CenterCrop支持PIL图像和张量(要求形状为(C, H, W))。 使用示例: 见引用[3]中的代码片段,其中使用了: transforms.CenterCrop(224) 我们也可以自己写一个例子: 示例代码: from torchvision.transforms import CenterCrop from PIL import Image # 创建一个CenterCrop转换,目标尺寸为224x224 center_crop = CenterCrop((224, 224)) # 打开一个图像 img = Image.open("test.jpg") # 应用中心裁剪 cropped_img = center_crop(img) # 显示或保存图像 cropped_img.show() 或者对于张量: import torch from torchvision import transforms transform = transforms.Compose([ transforms.ToTensor(), transforms.CenterCrop(224), # 注意:这里要求输入张量的高度和宽度都大于等于224 ]) 但是注意:在Compose中,如果先进行了ToTensor,那么CenterCrop处理的就是张量。而CenterCrop同时支持PIL和Tensor,所以这样写也可以。但是要注意,如果图像尺寸小于224,则会自动填充0(在张量模式下也是填充0)。 然而,在旧版本中(比如1.6之前),CenterCrop不支持对小于目标尺寸的图像进行填充,会报错。因此,在较新的版本(>=0.8.0?具体版本需查证)中,已经支持了自动填充。 为了确保兼容性,如果用户使用的是较旧版本,可能需要先调整图像大小(使用Resize)确保图像足够大,然后再进行CenterCrop。但在新版本中,可以直接使用CenterCrop,即使图像较小。 因此,我们可以在回答中说明:从torchvision 0.8.0(或0.9.0)开始,CenterCrop支持自动填充。 但为了准确,我们可以不提及具体版本,而是建议:如果输入图像尺寸可能小于目标尺寸,请确保使用较新版本的torchvision(>=0.8.0),否则可能会引发异常。 引用[3]中使用了Resize(256)然后CenterCrop(224),这是一种常见的做法:先缩放到较大尺寸,然后中心裁剪到目标尺寸。这样可以确保图像尺寸大于等于目标尺寸,避免填充带来的黑色边框(因为填充的黑色可能会引入噪声)。 因此,我们也可以建议:在不确定输入图像尺寸时,可以先使用Resize将图像缩放到一个较大的尺寸(比如256x256),然后再进行CenterCrop(224)。 总结回答结构: 1. 函数原型 2. 参数说明 3. 功能描述(包括对小于目标尺寸的处理) 4. 使用示例 5. 注意事项 同时,生成相关问题: 1. 如何同时调整和裁剪图像以符合模型输入要求? 2. CenterCrop和RandomCrop有什么区别? 3. 在图像预处理中,为什么经常先Resize再CenterCrop? 4. 当图像小于目标尺寸时,CenterCrop如何处理? 注意:由于引用[1]中提到了RandomCrop,我们可以对比一下,但用户本次只问CenterCrop。 下面开始回答:</think>### `torchvision.transforms.CenterCrop` 函数详解 #### 函数原型 ```python class torchvision.transforms.CenterCrop( size: Union[int, Sequence[int]] ) ``` #### 参数说明 1. **`size`** (必需参数) - 类型:`int` 或 `Sequence[int]`(如元组/列表) - 作用:指定裁剪区域尺寸 - 两种使用方式: - **单整数**:`size=224` → 裁剪为 224×224 的正方形 - **(高度, 宽度)元组**:`size=(256, 192)` → 裁剪为 256×192 的矩形 #### 功能特点 1. **中心裁剪**: 始终从图像正中心裁剪指定尺寸的区域,保持图像主体不变[^3]。 2. **尺寸处理**: - 若图像尺寸 ≥ 目标尺寸 → 直接裁剪 - 若图像尺寸 < 目标尺寸 → 自动用 **0 填充**(黑色区域)[^1] 3. **输入支持**: - PIL 图像 (`PIL.Image.Image`) - 张量 (`torch.Tensor`),形状需为 `(C, H, W)` #### 使用示例 ```python from torchvision import transforms from PIL import Image # 创建转换 square_crop = transforms.CenterCrop(224) # 裁剪为224×224正方形 rect_crop = transforms.CenterCrop((256, 192)) # 裁剪为256×192矩形 # 应用转换 image = Image.open("image.jpg") cropped_square = square_crop(image) # 正方形裁剪 cropped_rect = rect_crop(image) # 矩形裁剪 ``` #### 典型应用场景 常用于图像分类预处理流程(结合 `Resize`): ```python transform = transforms.Compose([ transforms.Resize(256), # 先缩放到256px短边 transforms.CenterCrop(224), # 再中心裁剪224×224 transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) ``` > 这种组合确保输入尺寸统一,同时保留图像主要内容[^3]。 #### 注意事项 1. **尺寸顺序**:矩形尺寸需按 **(高度, 宽度)** 顺序指定 2. **填充颜色**:默认填充黑色(0值),可通过后续处理调整 3. **与RandomCrop区别**: - `CenterCrop`:固定中心位置 - `RandomCrop`:随机位置裁剪(数据增强用)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值