一,原图
二,源代码
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中显示的图颜色这么奇怪
四,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 叠加效果