图像透明叠加

图像透明叠加_第1张图片

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

两张图像素材

图像透明叠加_第2张图片

图像透明叠加_第3张图片

上边胡子的图片是一张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)

图像透明叠加_第4张图片

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

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)

图像透明叠加_第5张图片

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

1.jpg

图像透明叠加_第6张图片

2.jpg 

图像透明叠加_第7张图片

3.png 

实现代码

#include 
#include 
#include 
#include 
#include 

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 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/蓝色的杯子, 没事多留言,让我们一起爱智求真吧.我的邮箱[email protected].

你可能感兴趣的:(计算机视觉知识点,opencv,计算机视觉)