You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用cv2将不同尺寸的两张图片粘贴到同一张背景图上?

解决方案:用OpenCV将不同尺寸图片粘贴到背景图

你之前遇到的ValueError是因为背景图切片的尺寸和待粘贴图片的尺寸不匹配——赋值操作要求两边的数组形状完全一致,你把背景图的切片高度加了10,导致和目标图片的形状不兼容,自然报错。

针对你提供的三张图片(星星100×100、三角形200×200、白色背景700×700),按要求合成的代码如下:

import cv2 as cv

# 读取图片(替换为你的本地文件路径)
star_img = cv.imread("star.png")
tri_img = cv.imread("triangle.png")
bg_img = cv.imread("white_bg.png")

# 检查图片是否读取成功
if star_img is None or tri_img is None or bg_img is None:
    print("图片读取失败,请检查文件路径")
    exit()

# 获取待粘贴图片的尺寸
star_h, star_w = star_img.shape[:2]
tri_h, tri_w = tri_img.shape[:2]

# 粘贴星星到背景图的(0,0)位置
bg_img[0:0+star_h, 0:0+star_w] = star_img

# 粘贴三角形到背景图的(250,250)位置(左上角起点)
bg_img[250:250+tri_h, 250:250+tri_w] = tri_img

# 保存合成后的图片
cv.imwrite("combined_img.png", bg_img)

关键注意事项

  • 必须保证待粘贴图片的区域不超出背景图的范围:比如三角形从(250,250)开始,右下角坐标是250+200=450,小于背景图的700,所以没问题。如果超出背景图尺寸,切片会报错。
  • 如果你的PNG图片带有透明通道,直接赋值会丢失透明效果,需要用alpha融合处理,示例代码如下:
# 处理带透明通道的图片
star_img = cv.imread("star.png", cv.IMREAD_UNCHANGED)
tri_img = cv.imread("triangle.png", cv.IMREAD_UNCHANGED)

# 分离颜色通道和alpha通道
star_bgr = star_img[:, :, :3]
star_alpha = star_img[:, :, 3] / 255.0
tri_bgr = tri_img[:, :, :3]
tri_alpha = tri_img[:, :, 3] / 255.0

# 星星区域融合
bg_star_region = bg_img[0:star_h, 0:star_w]
bg_img[0:star_h, 0:star_w] = (bg_star_region * (1 - star_alpha[:, :, None]) + star_bgr * star_alpha[:, :, None]).astype('uint8')

# 三角形区域融合
bg_tri_region = bg_img[250:250+tri_h, 250:250+tri_w]
bg_img[250:250+tri_h, 250:250+tri_w] = (bg_tri_region * (1 - tri_alpha[:, :, None]) + tri_bgr * tri_alpha[:, :, None]).astype('uint8')

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:02:26