Python OpenCV 同图复制透明圆形避免孔洞及混合过度问题
解决方案
问题原因
- 直接赋值出现孔洞:你提取的圆形素材是带Alpha透明通道的4通道图像,原图为3通道BGR格式,直接赋值时未处理透明通道,透明区域的像素值会直接覆盖原图对应位置,就会出现类似孔洞的暗色区域
- addWeighted混合过度:该接口会对整个粘贴区域做全局加权混合,圆形整体都会呈现半透明效果,无法得到清晰的轮廓
实现代码
核心思路是通过Alpha通道生成掩码,分离原图的背景和圆形的前景,再合并得到轮廓清晰的粘贴效果,代码如下:
import cv2 import numpy as np # 读取素材时需要加参数保留Alpha通道,若已提前读取可跳过这步 # circle = cv2.imread("你的圆形素材路径.png", cv2.IMREAD_UNCHANGED) height, width = circle.shape[:2] # 拆分圆形的BGR颜色通道与Alpha透明通道 b, g, r, a = cv2.split(circle) circle_bgr = cv2.merge((b, g, r)) # 生成前景掩码与背景反掩码 mask = a mask_inv = cv2.bitwise_not(mask) # 取出原图中要粘贴圆形的区域 roi = original_image[60:60+height, 40:40+width] # 分别提取原图背景部分与圆形前景部分 img_bg = cv2.bitwise_and(roi, roi, mask=mask_inv) img_fg = cv2.bitwise_and(circle_bgr, circle_bgr, mask=mask) # 合并后赋值回原图 dst = cv2.add(img_bg, img_fg) original_image[60:60+height, 40:40+width] = dst
如果需要制作多个圆形重叠的效果,只需重复上述操作,修改粘贴的坐标参数即可,后续粘贴的圆形会自动覆盖在之前的内容之上,得到堆叠效果。
内容的提问来源于stack exchange,提问作者Tuan Tran
相关产品推荐
相关产品推荐

