Opencv-python 实现多张透明图像叠加在一张图像上

我在网上看到这样的问题:
Python+OpenCV怎么实现多张png透明图像叠加在jpg图像上?? 就和这张图片一样 多张png叠加在jpg图片上
在这里插入图片描述
先看我做的效果
在这里插入图片描述

对方提供的图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现代码:

import cv2


def cv_show(neme, img):
    cv2.imshow(neme, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def Set_up_the(path, x, y):
    """
    图像路径,
    想放置的背景图的位置,左上角坐标
    :return:
    """
    image1 = cv2.imread(path)
    im1 = image1 == 0
    # 设置"图像1"放置在"背景图"中的位置:
    # 设置x y偏移多少
    _x, _y = x, y
    # 设置的参数:左上角、右下角坐标 x1 y1 x2 y2
    x1, y1, x2, y2 = 0 + _x, 0 + _y, image1.shape[1] + _x, image1.shape[0] + _y
    return x1, y1, x2, y2, im1, image1


def add(image1, image3, im, x1, y1, x2, y2):
    # 掩膜
    image1_ = image3[int(y1):int(y2), int(x1):int(x2)] * im
    # 图像相加
    image1_1 = cv2.add(image1_, image1)
    # 赋给原图
    image3[int(y1):int(y2), int(x1):int(x2)] = image1_1
    return image3


# 图像1
x1, y1, x2, y2, im1, image1 = Set_up_the("1.png", 100, 100)
# 图像2
x10, y10, x20, y20, im10, image2 = Set_up_the("2.png", 500, 100)

# 背景图
image3 = cv2.imread("3.jpg")

img = add(image1, image3, im1, x1, y1, x2, y2)
cv_show('neme', img)
img = add(image2, img, im10, x10, y10, x20, y20)
cv_show('neme', img)


另一个
在这里插入图片描述
尝试

import cv2


def cv_show(neme, img):
    # 调整宽高(再次运行也只会加载你调整后的宽高)
    cv2.namedWindow(neme, cv2.WINDOW_NORMAL)
    cv2.imshow(neme, img)  # 必要参数:名字和变量名
    cv2.waitKey(0)  # 括号中0=任意键终止,单位为毫秒级别
    cv2.destroyAllWindows()  # 关闭所有窗口--图片


import cv2
import numpy as np

# 加载图像
# 背景图
img1 = cv2.imread('1.jpg')
# 人像
img2 = cv2.imread('1.png')
# I want to put logo on top-left corner, So I create a ROI
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 可调节
ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# Now black-out the area of logo in ROI
# 取 roi 中与 mask 中不为零的值对应的像素的值,其他值为 0
# 注意这里必须有 mask=mask 或者 mask=mask_inv, 其中的 mask= 不能忽略
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
# 取 roi 中与 mask_inv 中不为零的值对应的像素的值,其他值为 0。
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('res', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默执_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值