如何用OpenCV将test.png缩放到400x500框内并保比例?需手动算缩放因子吗?
如何用OpenCV将图片缩放到400x500像素框内并保持宽高比?
刚好处理过类似的需求,给你理得明明白白:
首先明确:不能直接用cv2.resize(img, (400, 500)),除非你的原图宽高比刚好是4:5(400/500),否则强制设置这个尺寸会拉伸图片,彻底破坏原有的宽高比。所以必须手动计算合适的缩放因子,再进行缩放操作。
具体步骤和代码实现
- 先读取图片并获取它的原始宽高
import cv2 import numpy as np # 读取目标图片 img = cv2.imread("test.png") # OpenCV中图片shape的顺序是(高度, 宽度, 通道数),所以先取高和宽 original_h, original_w = img.shape[:2]
- 计算宽、高方向的缩放比例
我们要让缩后的图片能完全放进400x500的框里,所以分别计算宽度缩到400的比例,和高度缩到500的比例:
target_w, target_h = 400, 500 # 计算宽度方向的缩放比例 scale_w = target_w / original_w # 计算高度方向的缩放比例 scale_h = target_h / original_h
- 选择最小的缩放因子
取两个比例里较小的那个,这样缩后的图片既不会超出宽度限制,也不会超出高度限制,同时完美保持原有的宽高比:
scale_factor = min(scale_w, scale_h)
- 计算缩放后的新尺寸并执行缩放
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)
- (可选)如果需要把缩后的图片放到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_CUBIC或cv2.INTER_LINEAR
内容的提问来源于stack exchange,提问作者Basj




