用opencv实现两张半透明png图片以一定透明度叠加

这篇博客介绍了如何利用opencv将两张具有alpha通道的png图片以特定透明度叠加。通过调整前景图片的alpha通道并应用alpha compositing原理,实现了在Python中将红色图片以80%透明度叠加到蓝色图片上的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如我有如下两张透明、半透明图:

在photoshop中打开如下:

brush1brush2

前景:一张四通道的png图,BGR通道的值全为[0,0,200],透明度完全靠alpha通道的不同值来体现。

后景:一张四通道的png图,BGR通道的值全为[200,0,0] ,透明度完全靠alpha通道的不同值来体现。 

在画图软件中打开分别如下:左侧为前景,右侧为后景

brushes

现在想要把红色的画笔以百分之80的透明度叠加到蓝色的画笔上面。

基本的

### 使用 OpenCV 实现图片叠加 #### Python 中使用 OpenCV 进行图像叠加 为了实现两个图像的叠加效果,可以利用 `cv2.addWeighted()` 方法来完成透明度控制下的两幅图像相加。此方法允许指定每张输入图像的权重以及最终输出中的偏移量。 ```python import cv2 import numpy as np def overlay_image(background_path, foreground_path, output_path): # 加载背景和前景图像 background = cv2.imread(background_path) foreground = cv2.imread(foreground_path, cv2.IMREAD_UNCHANGED) # 获取前景图像尺寸并调整到合适大小 h, w = foreground.shape[:2] # 如果有alpha通道,则分离出来;如果没有则创建全白mask if foreground.shape[2] == 4: b_channel, g_channel, r_channel, alpha_channel = cv2.split(foreground) foreground_rgb = cv2.merge((b_channel, g_channel, r_channel)) mask = alpha_channel / 255.0 else: foreground_rgb = foreground mask = np.ones_like(foreground[:, :, :1]) # 将前景放置于背景之上特定位置 (这里假设放在中心) bh, bw = background.shape[:2] y_offset = (bh - h) // 2 x_offset = (bw - w) // 2 roi = background[y_offset:y_offset+h, x_offset:x_offset+w] # 计算带透明度的效果 masked_foreground = cv2.multiply(mask, foreground_rgb.astype(float)) masked_background = cv2.multiply(1-mask, roi.astype(float)) combined = cv2.add(masked_foreground, masked_background).astype(np.uint8) # 替换原始ROI区域为合成后的图像部分 background[y_offset:y_offset+h, x_offset:x_offset+w] = combined # 存储结果 cv2.imwrite(output_path, background) overlay_image('background.jpg', 'foreground.png', 'output.jpg') ``` 这段代码展示了如何读取两张图片并将带有Alpha通道(即支持半透明)的小图标覆盖到大图中央的位置上[^1]。 对于更复杂的场景,比如想要自定义旋转角度和平移坐标的情况,可以在调用`overlay_image`函数之前先对前景图像应用仿射变换矩阵来进行相应的转换操作[^2]。 此外,在Linux环境下特别是Ubuntu操作系统中开发此类功能时,需要注意安装好必要的依赖包,并确保环境配置正确以便能够顺利编译运行C++版本或是直接通过pip工具获取PythonOpenCV库文件[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值