在Jupyter Notebook中提取粘贴图像时为何出现ValueError?
问题:图像区域复制粘贴时的维度不匹配报错
我用Jupyter Notebook、OpenCV、Matplotlib和NumPy做学校的计算机视觉项目,要从图像里提取一块区域,粘贴到同一图像的其他位置(用y/x轴的切片)。之前运行正常,现在一直报错。
我的代码
img = cv2.imread('Images/flower.jpg') flower = img[2000:3200, 1300:2800] img[0:1200, 0:1500] = img[1200:2400, 1500:3000] = img[2400:3600, 3000:4500] = flower plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.title('more flowers') plt.axis('on') plt.show()
报错信息
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[12], line 3 1 img = cv2.imread('Images/flower.jpg') 2 flower = img[2000:3200, 1300:2800] ----> 3 img[0:1200, 0:1500] = img[1200:2400, 1500:3000] = img[2400:3600, 3000:4500] = flower 5 plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 6 plt.title('more flowers') ValueError: could not broadcast input array from shape (1200,1500,3) into shape (1200,770,3)
解决方案
错误原因
报错明确显示:要粘贴的flower形状是(1200,1500,3),但最后一个目标区域img[2400:3600, 3000:4500]实际形状是(1200,770,3)——你的原始图像宽度不足4500像素,3000到4500的切片实际只有770像素宽,两者宽度不匹配,导致无法完成赋值。
解决步骤
- 先确认图像实际尺寸:添加代码打印图像的高度和宽度,避免凭经验写切片范围:
img = cv2.imread('Images/flower.jpg') print(img.shape) # 输出格式为(高度, 宽度, 通道数),比如(3600, 3770, 3) - 调整切片范围匹配尺寸:根据打印出的实际宽度,修改目标区域的切片,确保每个目标区域的高度和宽度都和
flower完全一致(1200高、1500宽)。比如如果图像总宽度是3770,那最后一个区域的x轴切片不能到4500,最多只能到3000+1500=4500,但如果图像宽度不够,就得换个目标位置,或者缩小flower的提取范围。 - 可选:强制缩放匹配(会变形):如果必须把
flower放到这个区域,可以用cv2.resize()把flower缩放到目标区域的尺寸:# 先获取目标区域的形状 target_h, target_w = img[2400:3600, 3000:4500].shape[:2] resized_flower = cv2.resize(flower, (target_w, target_h)) # 再赋值 img[0:1200, 0:1500] = img[1200:2400, 1500:3000] = img[2400:3600, 3000:4500] = resized_flower
内容的提问来源于stack exchange,提问作者chuubry
相关产品推荐
相关产品推荐

