ValueError排查:无法将(240,320,3)数组广播至(480,640,3)
解决缩放图像粘贴到原尺寸画布时的ValueError问题
你在把缩放后的图像放到原尺寸黑色画布时遇到了形状不匹配的错误,我来帮你拆解问题并给出修复方案:
问题根源
你的x_lim和y_lim计算逻辑出了问题!咱们一步步看:
- 原图像宽640、高480,缩放因子0.5,所以缩放后的图像尺寸是320×240
- 你写的
x_lim = int(min(new_img_w,1)*orig_img_w),这里min(320,1)的结果是1,直接导致x_lim变成了640;同理y_lim变成了480 - 这时候你试图把
new_scaled_img[:480,:640,:]赋值给画布对应区域,但缩放后的图像只有240行、320列,取超出自身尺寸的范围自然会触发形状不匹配的ValueError
修正后的代码
其实逻辑很简单:直接用缩放后的图像尺寸作为画布上的粘贴范围,把小图放到画布左上角即可:
import cv2 import numpy as np # 假设image是你的原图像,尺寸为(640,480) orig_img_w, orig_img_h = image.shape[1], image.shape[0] scale_factor = 0.5 new_img_w = int(scale_factor * orig_img_w) new_img_h = int(scale_factor * orig_img_h) new_scaled_img = cv2.resize(image, (new_img_w, new_img_h)) # 创建原尺寸的黑色画布 canvas = np.zeros_like(image) # 直接用缩放后的图像尺寸作为粘贴范围,避免越界 canvas[:new_img_h, :new_img_w, :] = new_scaled_img new_scaled_img = canvas
额外扩展(可选)
如果之后需要把缩放后的图像放到画布中央,只需要计算偏移量即可:
x_offset = (orig_img_w - new_img_w) // 2 y_offset = (orig_img_h - new_img_h) // 2 canvas[y_offset:y_offset+new_img_h, x_offset:x_offset+new_img_w, :] = new_scaled_img
这样就不会再出现形状不匹配的问题啦!
内容的提问来源于stack exchange,提问作者aquantum
相关产品推荐
相关产品推荐

