OpenCV叠加透明背景图片出现黑色背景的解决方案问询
问题原因
你出现黑色背景的核心原因是cv2.imread默认读取图片时会丢弃透明Alpha通道,只返回3通道BGR数据,眼镜素材里原本透明的区域会被默认填充为0值(也就是黑色),直接赋值覆盖到人物图上就会显示黑色背景。
正确实现步骤
- 读取图片时添加
cv2.IMREAD_UNCHANGED参数,保留眼镜素材的Alpha通道 - 将眼镜数据拆分为RGB色彩通道和Alpha透明度通道,把Alpha通道归一化到0~1范围作为融合权重
- 按Alpha权重对人物图对应区域和眼镜图做加权融合,而非直接覆盖赋值
修正后可运行代码
import cv2 from PIL import Image # 读取人物图,BGR转RGB img = cv2.imread('pers.png')[...,::-1] img2 = img.copy() # 读取眼镜图,保留Alpha通道,BGRA转RGBA glasses = cv2.imread('glasses.png', cv2.IMREAD_UNCHANGED)[...,[2,1,0,3]] h, w = glasses.shape[:2] # 拆分色彩通道和Alpha通道 glasses_rgb = glasses[...,:3] alpha = glasses[...,3:] / 255.0 # 透明度归一化到0-1 # 提取人物图要叠加眼镜的区域 roi = img2[2:2+h, 4:4+w] # 按透明度权重融合两张图 merged_roi = glasses_rgb * alpha + roi * (1 - alpha) # 转成8位整型后赋值回原图 img2[2:2+h, 4:4+w] = merged_roi.astype('uint8') im = Image.fromarray(img2) im.save("resume.png")
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

