图像透明叠加

这篇文章介绍一个使用Opencv进行png透明头像叠加的小例子

两张图像素材

上边胡子的图片是一张png图片,包含a通道数据.使用opencv加载一下

image_3 = cv2.imread("image3.png", cv2.IMREAD_UNCHANGED)

数据大概是这个样子 shape = (320,640,4). 

[0,0,0,0],[0,0,0,0]....[0,0,0,128],[0,0,0,255][0,0,0,255][0,0,0,255]

第一种效果

image_1 = cv2.imread("imge1.jpg")
image_3 = cv2.imread("image3.png", cv2.IMREAD_UNCHANGED)
image_3 = cv2.resize(image_3, (100,100))
ones = np.ones((image_1.shape[0], image_1.shape[1]))*255
image_1 = np.dstack([image_1, ones])
image_1[150:250, 150:250] = image_3
cv2.imwrite("1.png", image_1)

注意上图中有一些白色, 如果把上图放到绿色背景中,白色就行变成绿色.说明上图中的白色表示透明的意思.如果想让上图中的白色变成大图中的颜色,可以这样写

image_1 = cv2.imread("imge1.jpg")
image_3 = cv2.imread("image3.png", cv2.IMREAD_UNCHANGED)

image_3 = cv2.resize(image_3, (100,100))
ones = np.ones((image_1.shape[0], image_1.shape[1]))*255
image_1 = np.dstack([image_1, ones])


alpha_image_3 = image_3[:, :, 3] / 255.0
alpha_image = 1 - alpha_image_3
for c in range(0, 3):
    image_1[150:250, 150:250, c] = ((alpha_image*image_1[150:250,      150:250, c]) + (alpha_image_3*image_3[:, :, c]))

cv2.imwrite("2.png", image_1)

使用C++实现一下.实现一个OSD叠加功能.

1.jpg

2.jpg 

3.png 

实现代码

#include <stdio.h>
#include <time.h>
#include <vector>
#include <iostream>
#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	//读取原图
	Mat src_img = imread("1.jpg");
	//读取osd图
	Mat osd_img = imread("2.jpg", 0);
	//osd图二值化
	cv::threshold(osd_img, osd_img, 0, 255, THRESH_BINARY);
	//原图转换为rgba图
	Mat src_img_rgba;
	cvtColor(src_img, src_img_rgba, COLOR_BGR2BGRA);
	//通道split
	vector<Mat> rgba_channels(4);
	split(src_img_rgba, rgba_channels);
	//把osd数据插入通道
	resize(osd_img, rgba_channels[3](cv::Rect(0, 0, osd_img.cols, osd_img.rows)), cv::Size(osd_img.cols, osd_img.rows));
	//通道组合
	cv::merge(rgba_channels, src_img_rgba);
	//保存新的图像
	imwrite("3.png", src_img_rgba);
	return 0;
}

最后的话:

这篇文章发布在CSDN/蓝色的杯子, 没事多留言,让我们一起爱智求真吧.我的邮箱wisdomfriend@126.com.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值