You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用OpenCV将test.png缩放到400x500框内并保比例?需手动算缩放因子吗?

如何用OpenCV将图片缩放到400x500像素框内并保持宽高比?

刚好处理过类似的需求,给你理得明明白白:

首先明确:不能直接用cv2.resize(img, (400, 500)),除非你的原图宽高比刚好是4:5(400/500),否则强制设置这个尺寸会拉伸图片,彻底破坏原有的宽高比。所以必须手动计算合适的缩放因子,再进行缩放操作。

具体步骤和代码实现

  1. 先读取图片并获取它的原始宽高
import cv2
import numpy as np

# 读取目标图片
img = cv2.imread("test.png")
# OpenCV中图片shape的顺序是(高度, 宽度, 通道数),所以先取高和宽
original_h, original_w = img.shape[:2]
  1. 计算宽、高方向的缩放比例
    我们要让缩后的图片能完全放进400x500的框里,所以分别计算宽度缩到400的比例,和高度缩到500的比例:
target_w, target_h = 400, 500
# 计算宽度方向的缩放比例
scale_w = target_w / original_w
# 计算高度方向的缩放比例
scale_h = target_h / original_h
  1. 选择最小的缩放因子
    取两个比例里较小的那个,这样缩后的图片既不会超出宽度限制,也不会超出高度限制,同时完美保持原有的宽高比:
scale_factor = min(scale_w, scale_h)
  1. 计算缩放后的新尺寸并执行缩放
new_w = int(original_w * scale_factor)
new_h = int(original_h * scale_factor)
# 缩小图片推荐用INTER_AREA插值,能获得更清晰的缩小效果
resized_img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_AREA)
  1. (可选)如果需要把缩后的图片放到400x500的背景框里(补边)
    如果你的需求是最终输出的图片尺寸严格是400x500,缩后的图片居中显示,那可以再做一步填充操作:
# 创建一个400x500的空白背景,这里用黑色填充,你也可以改成白色(255,255,255)
background = np.zeros((target_h, target_w, 3), dtype=np.uint8)
# 计算居中放置的偏移坐标
x_offset = (target_w - new_w) // 2
y_offset = (target_h - new_h) // 2
# 将缩后的图片放到背景的对应位置
background[y_offset:y_offset+new_h, x_offset:x_offset+new_w] = resized_img

总结一下

  • 直接用cv2.resize指定(400,500)会导致图片变形,必须手动计算缩放因子
  • 核心逻辑是取宽高缩放比例的最小值,保证缩后的图片完全适配目标框且不拉伸
  • 缩小图片优先用cv2.INTER_AREA插值,放大图片的话可以选择cv2.INTER_CUBICcv2.INTER_LINEAR

内容的提问来源于stack exchange,提问作者Basj

火山引擎 最新活动