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

深度学习图像预处理:Scale + Padding 方法详解

在深度学习的计算机视觉任务中,输入图像通常需要被调整到模型要求的固定尺寸(如 224×224、416×416 等)。然而,直接使用简单的resize操作(如双线性插值缩放)会破坏图像的原始宽高比,导致物体或场景发生非均匀形变,从而影响模型的识别性能。为了解决这一问题,业界普遍采用“先缩放再填充”(Scale + Padding)的策略。本文将详细解析该方法的原理、实现步骤、常见变体及其在主流框架中的应用。

为什么需要 Scale + Padding?

直接 Resize 的缺陷

假设原始图像尺寸为800×600(宽高比 4:3),目标尺寸为224×224(宽高比 1:1)。若直接缩放到224×224,图像在水平方向被压缩得更厉害(800→224,缩放因子 0.28),而垂直方向缩放因子为 0.373,导致图像内容发生非均匀形变(例如圆形物体变成椭圆形)。

Scale + Padding 的核心思想

  1. 保持宽高比:按原始图像的宽高比,将图像缩放到目标尺寸的某一边界(通常是较短的边)。
  2. 填充剩余区域:在缩放后的图像周围添加填充(Padding),使其达到目标尺寸。
  3. 可选居中/随机放置:填充通常置于图像四周(上下或左右),并可选择将缩放后的图像置于中央或随机位置。

这种方法在 YOLO、SSD、EfficientNet 等经典模型中广泛使用,能最大程度保留图像内容的几何真实性。

方法步骤详解

1.先填充为正方形图后缩放

  1. 确定长边和短边:
    首先,确定图像的长边和短边。长边是图像的宽度和高度中较长的那个,短边是较短的那个。
  2. 将图像变为正方形:
    以长边的长度作为正方形的边长,这意味着如果原始图像是长方形,那么它的一边将被扩展以形成一个正方形。
    较短的一边将围绕其周围填充像素,通常是白色或黑色像素,以确保图像变为正方形。
  3. 填充像素:
    填充操作会在短边的两侧添加像素,直到图像的宽度和高度相等。填充的像素数量取决于原始图像的尺寸和目标正方形的尺寸。
  4. 缩放(如双线性插值,最近邻插值等):
    一旦图像被转换为正方形,下一步是使用插值法将图像缩放到所需的目标尺寸。
    双线性插值是一种平滑的缩放技术,它通过考虑周围四个像素的值来计算新像素的值,这样可以减少缩放过程中的失真。
    示意图如下:
    原始图为宽为w,高为h,现在想要通过scalepadding这种方法变换为宽width,高为height的图。(这里假设w>h,h>w的情况与此类似)

第一步:确定长边与短边,然后将原始图变为正方形,边长长度为长边长度,在短边的外侧填充,使得图变为宽为w,高为w的图。
**
**

第二步:缩放变换,将上一步中得到的宽为w,高为w的图经过缩放变换后就变为了宽为width,高为height的目标大小的图了。

自此,变换就完成了,原始图宽w,高h,以及填充的其中一个部分(w-h)/2变换为目标图像后,很容易得到缩放关系如下:

w乘以(width/w)后,就变为了width,

h乘以(height/w)后,就变为了(h*height)/w了,图中未标注出来(第二步中间图的紫色区域的高度),

(w-h)/2乘以(height/w)后,就变为了((w-h)*height)/(2w)。

注意,如果目标的width与height不相等,也就是目标不为正方形就会造成w与h不是同等比例缩放,就会变形失真。所以这种方法只适用于width等于height的情况。

2.先缩放再填充(通用)

  1. 计算缩放比例:首先,根据目标尺寸和原始图像的宽高比,计算出图像在保持宽高比的情况下应该被缩放到的尺寸。这通常涉及到计算缩放比例,即目标尺寸与原始图像尺寸的比值,并选择较小的那个比例作为最终的缩放比例,以确保图像不会被拉伸或压缩。
  2. 进行resize操作:使用计算出的缩放比例对原始图像进行resize操作,得到一个新的图像。这个新图像的尺寸将小于或等于目标尺寸,但会保持原始图像的宽高比。
  3. 进行padding操作:最后,在新的图像的周围添加padding,以使其达到目标尺寸。padding可以使用任何颜色或图案,但通常选择中性色(如灰色或白色)以避免对图像内容造成干扰。padding的大小将根据目标尺寸和新图像尺寸之间的差异来确。

上图中实际上需要根据width/w与height/h两者的大小,决定ratio的值。为了防止在缩放过程中,某条边超过目标的长度,应该选择width/w与height/h的较小者作为ratio。看下面代码:

代码实现示例

Python + OpenCV 实现

import cv2
import numpy as np
def resize_and_pad(image, target_height, target_width, padding_value=(0, 0, 0)):
# 获取原始图像的高度和宽度
height, width = image.shape[:2]
# 计算缩放比例,使得图像的长宽比例保持不变
scale = min(target_width / width, target_height / height)

# 计算缩放后的尺寸 new_width = int(width * scale) new_height = int(height * scale) # 先对图像进行缩放 resized_image = cv2.resize(image, (new_width, new_height)) # 创建一个目标大小的空白图像(填充背景为自定义颜色) padded_image = np.full((target_height, target_width, 3), padding_value, dtype=np.uint8) # 计算填充的上下左右边距 top_padding = (target_height - new_height) // 2 # bottom_padding = target_height - new_height - top_padding left_padding = (target_width - new_width) // 2 # right_padding = target_width - new_width - left_padding # 将缩放后的图像放置到填充后的图像中心 padded_image[top_padding:top_padding + new_height, left_padding:left_padding + new_width] = resized_image return padded_image, resized_image, left_padding, top_padding

ifname== ‘main’:
# 示例使用
image = cv2.imread(‘./img/lena2.png’,1) # 读取图像 (528, 532, 3)
# image_resize=cv2.resize(image,None,fx=0.5,fy=0.5)
# cv2.imwrite(“img/lena_02.png”, image_resize)
print(“image.shape”,image.shape)#(400, 323, 3)
target_height = 300 # 目标高度
target_width = 400 # 目标宽度
padding_value = (114, 114, 114) # 自定义填充值(RGB)

padded_image, resized_image, left_padding, top_padding = resize_and_pad(image, target_height, target_width,padding_value) print("padded_image.shape", padded_image.shape) # 保存结果 cv2.imwrite('result.jpg', padded_image)
## 变体与优化 ### 1. 自适应填充策略 - **最小填充**:缩放时选择使填充面积最小的边(短边或长边)。 - **最大内接矩形**:保持宽高比的同时,使缩放后的图像尽可能大且完全位于目标画布内。 ### 2. 填充颜色选择 - **零填充**:最简单,但可能引入黑色边框干扰。 - **均值填充**:使用数据集的平均像素值,减少分布偏移。 - **边缘复制/反射填充**:更适合自然图像,避免突兀边界。 ### 3. 多尺度训练(Multi-Scale Training) 在训练时随机选择不同的目标尺寸或缩放比例,增强模型对不同尺寸的鲁棒性。 ### 4. 坐标还原(用于目标检测) 对于目标检测任务,需要将标注框的坐标也进行相同的变换: ```python def transform_bbox(bbox, scale, pad_top, pad_left): """ 将原始标注框坐标转换到处理后的图像坐标系。 Args: bbox: [x_min, y_min, x_max, y_max](原始图像坐标系) scale: 缩放比例 pad_top, pad_left: 上、左填充量 Returns: transformed_bbox: 转换后的坐标 """ x_min, y_min, x_max, y_max = bbox # 缩放 x_min = x_min * scale y_min = y_min * scale x_max = x_max * scale y_max = y_max * scale # 平移(加上填充偏移) x_min += pad_left y_min += pad_top x_max += pad_left y_max += pad_top return [x_min, y_min, x_max, y_max]

在主流框架中的应用

YOLO 系列

YOLOv5/v7/v8 的预处理通常包含:

  1. 按短边缩放至目标尺寸(保持宽高比)
  2. 用灰色(114)填充剩余区域
  3. 图像居中放置

TensorFlow/Keras

fromtensorflow.keras.preprocessing.imageimportsmart_resize# smart_resize 会自动保持宽高比并填充

MMDetection

在配置文件中通过ResizePad变换组合实现:

train_pipeline=[dict(type='Resize',keep_ratio=True),# 保持宽高比缩放dict(type='Pad',size_divisor=32),# 填充到32的倍数]

可视化对比

为了直观展示不同方法的差异,我们通过以下流程图说明 Scale + Padding 的处理流程:

原始图像
W_orig × H_orig

计算缩放比例
scale = min(W_target/W_orig, H_target/H_orig)

缩放图像
new_w = W_orig × scale
new_h = H_orig × scale

创建目标画布
尺寸: W_target × H_target

计算填充位置
pad_left = (W_target - new_w) // 2
pad_top = (H_target - new_h) // 2

将缩放图像放入画布
位置: pad_left, pad_top

输出处理后的图像

直接 Resize

图像形变失真

保持宽高比,内容无扭曲

总结与最佳实践

优点

  1. 保持宽高比:避免图像内容非均匀形变
  2. 简单高效:计算量小,易于实现
  3. 兼容性强:适用于各种模型架构
  4. 可逆变换:便于坐标还原和后处理

缺点

  1. 信息损失:填充区域不包含有效内容
  2. 计算浪费:填充像素增加计算负担
  3. 边界效应:填充值可能影响卷积边界

实践建议

  1. 训练时:可使用随机填充位置(mode='random')作为数据增强
  2. 推理时:使用居中填充保证结果一致性
  3. 目标检测:注意坐标变换,确保标注框同步处理
  4. 填充值选择:根据数据集特性选择(零填充、均值填充或边缘填充)

扩展阅读

  • YOLOv5 预处理源码分析
  • OpenCV 图像几何变换文档
  • PyTorch torchvision.transforms 官方文档

通过 Scale + Padding 方法,我们可以在保持图像内容几何真实性的前提下,适配深度学习模型对输入尺寸的要求,是计算机视觉预处理中一项基础而重要的技术。

http://www.cnnetsun.cn/news/3829066.html

相关文章:

  • 掌握Windows窗口置顶技巧:AlwaysOnTop让你的重要窗口永远在前
  • Python魔术方法与变量详解:从原理到实践
  • 终极指南:如何彻底禁用Windows Defender并重获系统控制权
  • BetterNCM安装器完整指南:3分钟打造你的网易云音乐插件生态
  • 大型集团财务组织体系建设与数字化转型实践
  • 中国行政区划矢量数据GIS解决方案:从数据碎片化到标准化空间分析的技术实践
  • 智慧慢病管理平台源码
  • 天津GEO优化服务机构排行:本地与全国核心服务商实测版
  • 硬实时系统调度:RMA理论与嵌入式实践
  • 从设计到成品:金属贴片定制全流程解析(含打磨、雕刻、烧钛工艺)
  • 粒子群模糊PID控制算法在电机控制中的Matlab实现
  • 绝区零智能辅助工具:从手动肝到全自动的终极突破
  • 嵌入式DMA技术实战:从原理到ADC高速采集应用
  • Python数据分析系统在咖啡行业的应用与实践
  • 联想拯救者笔记本终极控制指南:用开源工具告别臃肿官方软件
  • React组件命名规则:首字母大写的底层原理与最佳实践
  • WPS高级应用与设计:从性能优化到自动化,打造高效办公环境
  • 抖音批量下载终极指南:douyin-downloader免费工具完整使用教程
  • 动态网络架构实战:SDN与弹性资源池化技术解析
  • 技术深度解析:中国四级行政区划矢量数据架构与GIS应用实践
  • 中国行政区划矢量数据的空间语义架构解析
  • 德国慕尼黑国际太阳能展特装展台施工落地方案拆解
  • 智能CLI工具Grok Build:用自然语言自动化日常任务的技术实践
  • 温湿度联网在线实时监控哪个品牌好
  • 内容平台流量密码:表情符号与视觉元素在标题优化中的实战应用
  • Cesium地形高度获取:原理、方法与应用场景
  • VMware虚拟机安装Win10全攻略:从环境隔离到性能调优
  • JavaScript可选链操作符(?.): 告别Cannot read property错误
  • Sunshine游戏串流终极指南:打造个人专属云游戏平台的专业教程
  • 【AI学习路线图黄金框架】:从数学筑基→模型训练→工程部署→商业落地的5层漏斗式能力模型