Python OpenCV如何基于掩码实现图像混合合成效果
OpenCV实现与PIL composite等价的图像掩码混合
准备素材
现有3张图像素材:
- original.png(原图):

- background.png(背景图):

- mask.png(掩码图,单通道灰度图):

目标效果
将三张图按掩码规则混合,输出result.png,预期效果如下:
混合规则和PIL的Image.composite(original, background, mask)完全一致:掩码白色(值为255)区域显示原图内容,掩码黑色(值为0)区域显示背景内容,灰度过渡区域做像素级线性融合。
已验证的PIL实现代码
from PIL import Image original = Image.open('original.png').convert('RGB') background = Image.open('background.png').convert('RGB') mask = Image.open('mask.png').convert('L') result = Image.composite(original, background, mask) result.save('result.png')
OpenCV实现补全
待补全的基础代码框架:
import cv2 original = cv2.imread('original.png') background = cv2.imread('background.png') mask = cv2.imread('mask.png', 0) result = ???? # 核心逻辑待补全 cv2.imwrite('result.png', result)
核心逻辑写法
两种等价实现,输出效果和PIL版本完全一致:
- 内置API简洁写法(推荐)
result = background.copy() original.copyTo(result, mask)
- 手动加权计算写法(逻辑透明,方便自定义修改)
# 把单通道掩码转为3通道,归一化到0-1范围匹配浮点计算 mask_bgr = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR) / 255.0 result = (original * mask_bgr + background * (1 - mask_bgr)).astype("uint8")
注意:OpenCV默认读取的彩色图是BGR通道顺序,和PIL的RGB顺序不影响本次混合的最终结果,因为两张图的通道顺序一致,按像素加权/拷贝不会出现色彩偏差。
内容的提问来源于stack exchange,提问作者jonmorrey76
相关产品推荐
相关产品推荐

