如何使用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
相关产品推荐
相关产品推荐

