两张图叠加 Python OpenCV 及 C++ OpenCV3实现

一,原图
两张图叠加 Python OpenCV 及 C++ OpenCV3实现_第1张图片
两张图叠加 Python OpenCV 及 C++ OpenCV3实现_第2张图片

二,源代码

20190720改
#用下面这句也可以叠加两幅图,前景图不需要二值化
#black_image是背景图
#[:img_h, :img_w]  是roi区域,前景图在背景图上放置的位置
#image  是前景图,前景图的尺寸应该小于背景图
black_image[:img_h, :img_w] = image  #

# -*- coding: utf-8 -*-
import os
import cv2
import numpy as np
import pylab as pl  #画图

img1 = cv2.imread('lena.jpg',0)
img2 = cv2.imread('opencv-logo-white.jpg',0)

# 把logo放在左上角,所以我们只关心这一块区域
h= img1.shape[0]
w= img1.shape[1]
rows= img2.shape[0]
cols= img2.shape[1]
roi = img1[int((h-rows)/2):rows+int((h-rows)/2),int((w-cols)/2):cols+int((w-cols)/2)]

# 创建掩膜
img2gray = img2
ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_OTSU)
mask_inv = cv2.bitwise_not(mask)

# 保留除logo外的背景
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)  #注意此处改成mask=mask的区别
dst = cv2.add(img1_bg, img2)  # 进行融合
img1[int((h-rows)/2):rows+int((h-rows)/2),int((w-cols)/2):cols+int((w-cols)/2)] = dst  # 融合后放在原图上

pl.figure("img1")
pl.imshow(img1)
pl.show()

三,效果图
读取的是黑白图,而且opencv logo也进行了二值化,但是不知道为啥python中显示的图颜色这么奇怪
两张图叠加 Python OpenCV 及 C++ OpenCV3实现_第3张图片

四,C++ opencv3实现两张图叠加

20190720改
bool ROI_AddImage()
{

	//【1】读入图像
	Mat srcImage1 = imread("D:\\1\\666.png");

	//截图
	//Rect myrect;
	//myrect.x = 151;
	//myrect.y = 144;
	//myrect.width = 36;
	//myrect.height = 12;
	//Mat imgrect = srcImage1(Rect(myrect.x, myrect.y, myrect.width, myrect.height));\
	//imwrite("D:\\666.png", imgrect);
	//int a = 0;


	Mat logoImage = imread("D:\\1.png");

	//【2】定义一个Mat类型并给其设定ROI区域
	Mat imageROI = srcImage1(Rect(0, 0, logoImage.cols, logoImage.rows));

	//【3】将掩膜拷贝到ROI
	logoImage.copyTo(imageROI);

	//【4】显示结果
	imwrite("D:\\1\\666.png", srcImage1);
	return true;
}
bool ROI_AddImage()
{

	    //【1】读入图像
	    Mat srcImage1 = imread("D:\\661.jpg",0);
	    Mat logoImage = imread("D:\\662.jpg",0);
	
		if (!srcImage1.data)
		{
		   printf("fuck, read the picture is wrong!!! \n");
		   return false;
		}
	
		if (!logoImage.data)
		{
		   printf("fuck, read the picture is wrong!!! \n");
		   return false;
	    }
	
		//【2】定义一个Mat类型并给其设定ROI区域
		 Mat imageROI = srcImage1(Rect(0, 0, logoImage.cols, logoImage.rows));
	
	    //【3】加载掩膜
		Mat mask = imread("D:\\662.jpg", 0);
	
		//【4】将掩膜拷贝到ROI
	    //logoImage.copyTo(imageROI, mask);
	    logoImage.copyTo(imageROI);
	
		//【5】显示结果
		namedWindow("1 利用ROI实现图像叠加示例窗口");
	    imshow("1 利用ROI实现图像叠加示例窗口", srcImage1);
		waitKey(0);
	    return true;
}

五,C++ opencv3 叠加效果
两张图叠加 Python OpenCV 及 C++ OpenCV3实现_第4张图片

欢迎扫码关注我的微信公众号

在这里插入图片描述

你可能感兴趣的:(#,OpenCV其他)