如何将YoloV3检测得到的200*200边界框图像调整为368*368尺寸
200200行人裁剪图调整为368368输入尺寸的可行方案
以下是工业界常用的几类实现方法,可根据后续模型的特性按需选择:
1 直接强制缩放
- 实现逻辑最简单,运算速度最快,直接调用resize方法将200200的图像强制拉伸为368368的目标尺寸
- 缺点是会改变目标宽高比,导致行人形变,可能降低后续模型的识别精度
- 参考代码:
resized_img = cv2.resize(crop_img, (368, 368), interpolation=cv2.INTER_CUBIC)
插值方法可按需调整:放大场景优先用INTER_CUBIC/INTER_LINEAR保证画质,追求极致速度可换用INTER_NEAREST
2 保持宽高比+边缘填充
- 目前最通用的预处理方案,完全不会改变原图的内容比例,避免行人形变
- 操作逻辑:先将原图等比放大到长边等于368,再对短边两侧填充像素至368*368;填充值可选择128(中性灰)、原图边缘均值,也可以用黑色(0),降低填充区域对模型的干扰
- 参考代码:
import cv2 h, w = crop_img.shape[:2] # 计算等比缩放系数 scale = 368 / max(h, w) new_h, new_w = int(h * scale), int(w * scale) scaled_img = cv2.resize(crop_img, (new_w, new_h), interpolation=cv2.INTER_CUBIC) # 计算上下、左右的填充边距 pad_top = (368 - new_h) // 2 pad_bottom = 368 - new_h - pad_top pad_left = (368 - new_w) // 2 pad_right = 368 - new_w - pad_left # 填充得到目标尺寸图像 resized_img = cv2.copyMakeBorder(scaled_img, pad_top, pad_bottom, pad_left, pad_right, cv2.BORDER_CONSTANT, value=(128, 128, 128))
- 缺点是会引入无关的填充区域,需要后续模型对填充内容有一定鲁棒性
3 放大后中心裁剪
如果后续模型对图像边缘信息不敏感,可以选择该方案,既不会引入填充像素,也不会产生整体形变
- 操作逻辑:先将200200的原图放大到略大于368368的尺寸,再裁剪出中心368*368的区域作为输入
- 缺点是会丢失原图边缘的少量内容
- 参考代码:
scaled_large = cv2.resize(crop_img, (370, 370), interpolation=cv2.INTER_CUBIC) resized_img = scaled_large[1:369, 1:369]
内容的提问来源于stack exchange,提问作者user102789
相关产品推荐
相关产品推荐

